初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言

C++是一种通用的编程语言,被广泛用于开发各种应用程序,包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展,添加了许多新特性和功能,并支持面向对象编程。C++可以在不同的平台上编译和运行,具有高效性、可移植性和灵活性等特点。它的语法和语义与C语言相似,但还包括了类、模板、异常处理和STL(标准模板库)等特性。C++是一种强大而灵活的编程语言。简单的说,C++就是C语言的plus版本,C++的出现就是建立在C语言之上的。

一.命名空间

命名空间(Namespace)是一种组织和管理代码的方式,它将代码分组并提供了唯一的标识符(名称)来引用这些代码。它的主要作用是避免命名冲突,让不同模块或代码库中的同名元素能够被准确地引用。举个例子:

#include<stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”printf("%d\n", rand);return 0;
}

如果我把这个代码放到编译器里编译就会出现报错,说的是我们的rand重定义了。那是因为在头文件stdlib里我们有rand这个函数。这就是命名冲突了。

1.1namespace的价值

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染,这时在我们的C++里面就引入了一个叫namespace的东西,在东西就可以很好的解决掉命名冲突的问题。

1.2namespace的定义

1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员(值得注意的是在{}后面不加;)。命名空间中可以定义变量/函数/类型等。
就像是这样:
#include<stdio.h>
#include <stdlib.h>
namespace lwz
{//在命名空间里可以是变量、函数和类型int rand = 10;int Add(int a, int b){return a + b;}struct LNode{int* a;struct LNode* next;};
}
int main()
{// 这里默认是访问的是全局的rand函数指针printf("%p\n", rand);// 这里指定lwz命名空间中的randprintf("%d\n",lwz::rand);return 0;
}
2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。
3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
4.namespace只能定义在全局,当然他还可以嵌套定义。
像是这样:
namespace a
{namespace b{int Add(int x, int y){return x + y;}}namespace c{int Add(int x, int y){return x + y;}}
}
int main()
{printf("%d\n", a::b::Add(1, 2));printf("%d\n", a::c::Add(2, 2));return 0;
}

这里我在命名空间a里嵌套了两个命名空间b和c,在我们使用的时候,用::就可以访问命名空间里的东西了。

5.项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。
这句话的意思就是,假如我创建了多个.cpp的文档,并且我都创建了一个名字为lwz的命名空间,那么在运行的时候,会认为这些文档里lwz都是一个东西,可以理解为把所有名字为lwz的命名空间都合在一起了。
6.C++标准库都放在⼀个叫std(standard)的命名空间中。

1.3命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以
下⾯程序会编译报错。所以我们要使用命名空间中定义的变量/函数,有三种方式:
指定命名空间访问,项目中推荐这种方式。
这种方式就是上面我一直用到的方式:
namespace lwz
{int a = 0;int b = 10;
}
int main()
{printf("%d\n", lwz::a);printf("%d\n", lwz::b);return 0;
}
using将命名空间中某个 成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
展开的方式也可以使用,但是风险很大:
namespace lwz
{int a = 0;int b = 10;
}
using namespace lwz;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

using的作用就是展开我们的命名空间,可以理解为把lwz域里的东西拿到全局域里。当然也可以单独的把命名空间里的某个特殊成员展开。

namespace lwz
{int a = 0;int b = 10;
}
using lwz::a;
int main()
{printf("%d\n", a);printf("%d\n", lwz::b);return 0;
}

二.输入输出

虽然C++是兼容C语言的,但是C++还是有自己的一套输入输出。我先简单的写一个输入输出:

#include<iostream>
using namespace std;
int main()
{int a = 0;double b=0.0;char c = 'a';std::cout << a << " " << b << " " << c <<std::endl;//我们在输出时可以自动的识别变量的类型cin >> a >> b >> c;//输入1 2.222 xcout << a << " " << b << " " << c << endl;//输出1 2.222 xreturn 0;
}
<iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输 出对象。
std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入 流。
std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。
<<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
使⽤C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入 输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是 C++的流能更好的支持自定义类型对象的输入输出。
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使用方式去用他们。
⼀般日常练习中我们可以using namespace std,实际项开发中不建议using namespace std。
我们没有包含<stdio.h>,也可以使printf和scanf,在包含<iostream>间接包含了。vs系列 编译器是这样的,其他编译器可能会报错。

三.缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)

#include<iostream>
using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func(); // 没有传参时,使用参数的默认值Func(10); // 传参时,使用指定的实参return 0;
}

打印出的就是0  10.

全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

#include<iostream>
using namespace std;
void func1(int a=10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{func1();func1(1);func1(1, 2);func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200,300);return 0;
}

值得注意的是,在半缺省里,函数不可以是void Func2(int a=10, int b, int c = 20)或者void Func2(int a=10, int b, int)。

带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

这里也就刚好对应上面的那一条,半缺省参数必须是从右往左依次连续缺省。

函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省
值。
这里我来解释一下这句话,当时我在用C语言实现栈的时候,我把函数的声明和定义放到了两个文档里面。此时的声明和定义是分离的,在实现栈的初始化的时候,我们可以用一个缺省参数来实现:
首先这是Stack.h文件:
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
void STInit(ST* ps, int n = 4);

此时我们已经在Stack.h文件里已经有了缺省参数,然后是.cpp文件:

#include"Stack.h"
void STInit(ST* ps, int n=10)
{assert(ps && n > 0);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;
}

如果继续再函数定义这里还有缺省参数的话,就会导致重定义的问题出现。所以一定要是在函数声明给缺省值。

四.函数重载

C++支持在同⼀作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。

4.1参数类型不同

#include <iostream>
#include <assert.h>
using namespace std;
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
int main()
{Add(1, 2);Add(1.23, 2.13);return 0;
}

最终打印出“”

4.2参数个数不同

void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(10);return 0;
}

最后打印出:

 

4.3参数顺序不同

这个实际上也是参数类型不同

void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}

最终打印出:

 

4.4其他情况 

值得注意的是,返回值不同不能作为重载条件,因为调用的时候也无法区分。

包括还有一种情况也会报错:

void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}

假如我调用的时候没有参数,编译器就不知道调用谁。

到这里我简单的介绍了几个简单的C++的语法,也是C++入门必须要知道的东西,如有错误还请多多指出,感谢观看。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开放式耳机哪个品牌比较好?2024最值得推荐的火爆机型!!

在这个快节奏的时代&#xff0c;我们都在寻找那些既能让我们享受音乐&#xff0c;又能保持对外界感知的音频设备。开放式耳机以其独特的设计&#xff0c;满足了这一需求&#xff0c;它们让你在享受音乐的同时&#xff0c;还能听到周围环境的声音&#xff0c;无论是安全出行还是…

华为、H3C、锐捷、思科四大设备厂商交换机配置命令总结合辑

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 一直以来&#xff0c;对于华为、H3C、锐捷、思科交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;四…

谱瑞科技高速传输接口芯片选型应用

谱瑞科技股份有限公司为一专供多种普及显示器以及个人计算机、消费性电子产品与显示面板所使用之高速讯号传输接口标准之混和信号 IC 芯片之领导供货商。谱瑞公司成立于 2005 年为一无自有晶圆厂之半导体公司&#xff0c;并于 2011 年股票在台湾柜台买卖中心正式挂牌交易(股票代…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

【删库跑路】一次删除pip下载的所有第三方库方法

进入命令行&#xff0c;先list看下库存 pip list导出所有的第三方库至一文件列表 pip freeze >requirements.txt按照列表卸载所有库 pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

1、课程导学(react+区块链实战)

1、课程导学&#xff08;react区块链实战&#xff09; 1&#xff0c;课程概述&#xff08;1&#xff09;课程安排&#xff08;2&#xff09;学习前提&#xff08;3&#xff09;讲授方式&#xff08;4&#xff09;课程收获 2&#xff0c;ibloackchain&#xff08;1&#xff09;安…

java:字符缓冲流特有功能

BufferedWriter&#xff1a; void newLine&#xff08;&#xff09;&#xff1a;写一行行分隔符&#xff0c;行分隔符字符串由系统属性定义 BufferedReader&#xff1a; public String readLine&#xff08;&#xff09;&#xff1a;读一行文字&#xff0c;结果包含行的内容的字…

AI赋能OFFICE 智能化办公利器!

ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个文档编辑器无疑成为了办公软件中的翘楚。它不仅支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;还允许多人在线协作&#xff0c;并支持AI集成&…

哪些独立站外链策略最有效?

在当前的SEO领域中&#xff0c;独立站外链策略的效果差异很大&#xff0c;但GPB外链无疑是其中最为有效的一种。GPB外链&#xff0c;指的是通过高质量、包收录且dofollow的顶级域名独立站来获得外链&#xff0c;这种外链策略能够显著提升目标网站的整体排名数据。 关键词排名的…

redis学习(007 实战:黑马点评:登录)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第25p-第p34的内容 文章目录 短信登录功能session 共享问题 短信登录功能 接口编写 这里是Result的封装 过滤器在拦截器的外层…

嵌入式系统中的实时操作系统任务调度策略

嵌入式系统中的实时操作系统任务调度策略 在嵌入式系统中&#xff0c;实时任务调度是确保系统响应性和稳定性的关键方面之一。不同的任务调度策略可以影响系统的性能和实时性。本文将深入探讨两种常见的实时任务调度策略&#xff1a;固定优先级调度和循环时间片调度&#xff0…

mysql查询语句执行流程

流程图 连接器&#xff1a;建立连接&#xff0c;管理连接、校验用户身份&#xff1b;查询缓存&#xff1a;查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。MySQL 8.0 已删除该模块&#xff1b;解析 SQL&#xff0c;通过解析器对 SQL 查询语句进行词法分析、…

阿尔泰科技与西安交通大学陕西省某技术重点实验室共谋未来!

近日&#xff0c;阿尔泰科技的电子工程师&#xff08;熊工&#xff09;应邀前往西安交通大学陕西省某技术重点实验室&#xff0c;参与课题组项目的测试与调试工作。此次合作不仅成功推动了项目的进展&#xff0c;还为未来的深入合作奠定了坚实基础。 阿尔泰科技作为领先的测控技…

基于SpringBoot构造超简易QQ邮件服务发送(分离-图解-新手)

目录 获取QQ 授权码 SpringBoot构建 依赖 Yaml配置 服务编写 测试 获取QQ 授权码 https://mail.qq.com/ 接着后就会有对应的密钥了 SpringBoot构建 依赖 这里的建议是 2.0系列的Springboot版本用低一点的邮件依赖 <!-- 电子邮件 --> <dependency>&…

物联网实战:STM32+ESP8266温湿度数据采集上传Linux服务器与数据库可视化(附代码示例)

摘要: 本文将手把手教你搭建一个完整的物联网数据监控平台&#xff0c;使用STM32采集温湿度数据&#xff0c;通过ESP8266 WiFi模块上传至Linux服务器&#xff0c;并利用Python脚本将数据存储到MySQL数据库&#xff0c;最后实现每日平均值的计算和可视化展示。 关键词: STM32, …

抖音本地生活火爆!普通人如何申请抖音本地生活服务商?

当前&#xff0c;随着抖音外卖的正式开放&#xff0c;抖音本地生活的热度也迎来了新的高潮&#xff0c;与抖音本地生活服务商怎么申请等话题相关的词条更是成为了多个创业者社群的热搜榜单的常客。 事实上&#xff0c;就抖音本地生活服务商怎么申请等问题本身而言&#xff0c;…

nvm安装报错(镜像问题)

一、问题报错 安装的时候如果跟着网上早些时候的配置&#xff0c;调整了setting文件&#xff0c;配置镜像的话&#xff0c;可能报这个错误。 这个是因为他没检索到后面的链接地址&#xff0c;因为镜像的地址新的已经更换了。使用这个吧&#xff1a; node_mirror: https://npm…

java基础01—根据源码分析128陷阱以及如何避免128陷阱

源码分析128陷阱 如上图所示&#xff0c;int类型数据超过127依旧能正常比较&#xff0c;但Integer类型就无法正确比较了 /*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache …

视频监控管理平台智能边缘分析一体机视频监控系统客流统计检测算法

在当今数据驱动的时代&#xff0c;客流统计作为商业分析的重要手段&#xff0c;其准确性和实时性对于商家决策具有至关重要的影响。随着技术的发展&#xff0c;智能边缘分析一体机结合了边缘计算与深度学习技术&#xff0c;为客流统计提供了更为高效、精准的解决方案。 首先&am…

美容师有什么话术技巧?美业人如何提升自己的销售技巧?博弈美业门店管理系统分享经验

作为一名美容师&#xff0c;有一些话术和销售技巧可以帮助你提升服务质量和销售业绩。以下是博弈美业收银系统分享的一些建议&#xff1a; 1.建立信任&#xff1a; 在与客户交流时&#xff0c;表现出真诚、友好和专业的态度。倾听客户的需求&#xff0c;并给予针对性的建议&a…