C++入门基础(一)

发布于:2022-12-15 ⋅ 阅读:(214) ⋅ 点赞:(0)

一、命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1.1命名空间的定义
命名空间的定义我们需要用到namespace后面跟命名空间的名字,再接一对{},{}中即为命名空间的成员,命名空间里面可以有变量、函数、还可以进行命名空间的嵌套如图:
在这里插入图片描述
1.2命名空间的使用
命名空间中成员该如何使用呢?
其实也非常简单,我们只需要在需要访问的成员、函数前面加上命名空间的名称和作用域限定符::。
如图:
在这里插入图片描述
我们可以发现两个变量名相同的变量可以同时存在,并且编译器不会报错,这也是命名空间的好处,其实这个yj::加在变量名和函数的前面就是告诉编译器,让它去yj这个命名空间去找a和b这两个变量,如果不加这个编译器就会先去局部找,再去全局找,并不会到yj这个命名空间里面去找,另外这里命名空间里面的a和b是0的原因是因为在里面定义的变量其实是全局变量,全局变量是会自动初始化成0的。

在同一个工程中,如果定义了名称相同的命名空间,其实编译器是会将它们合并的,这里我也给大家验证一下:
在这里插入图片描述
这里我们可以发现,我定义了两个名称相同的命名空间,但我也可以去访问c这个成员变量,并不会产生重定义。

二、C++输入&输出

C++的输入和输出都是用cout和cin进行输出输入的,与C语言不同的是,C++的输入和输出是不需要指定什么类型,它们都在iostream这个头文件里面。
在这里插入图片描述
另外加这个std的原因是因为cout和cin都在std这个命名空间里面,我们也可以加上一句using namespace std;这样就相当于把这个命名空间的内容全部都展开了,也就不需要加上std::了,或者也可以展开部分的命名空间,另外我这里的endl其实就是换行的意思。
在这里插入图片描述cout<<和cin>>之所以可以输出和输入任意类型是因为运算符重载,当cout<<或cin>>时其实是会去调用对应匹配的函数进行输出和输入的。

三、缺省参数

3.1 缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
在这里插入图片描述
3.2 缺省参数分类
在这里插入图片描述
这里我们需要注意几个问题:
1、 半缺省参数必须从右往左依次来给出,不能间隔着给,否则编译器无法识别要不要用缺省值,从而报错
2、缺省参数不能在函数声明和定义中同时出现
3. 缺省值必须是常量或者全局变量

四、函数重载

4.1函数重载概念
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
这里我给大家举一个例子:像我们以前在C语言中写交换函数的时候,是不允许定义同名函数的,而C++可以。
在这里插入图片描述
我们可以发现调用的都是swap这个函数但是实现出来的效果却不一样,这其实和C++的函数名修饰规则有关系,像C语言为什么不支持函数重载呢?是因为它调用这个函数的时候是拿函数的名字去找,从而如果定义两个同名函数,编译器就无法识别到底调用哪个函数,而C++对函数名进行了修饰,假如说有两个同名函数,一个函数的参数是int,int,一个函数的参数是double,double,第一个函数的名字后面会加上ii,也就是两个int的首字母,同理double就是dd,当然每个编译器的修饰规则是不一样的,但都是通过函数名修饰规则去选择调用哪个函数的。
大家思考一下这两个函数是否构成重载?`

short Add(short left, short right)
{
 return left+right;
}
int Add(short left, short right)
{
 return left+right;
}

答案是不构成,因为返回值不参与函数名修饰规则,但是如果真要让返回值参与函数名修饰规则也是可以的,设计的人之所以不让返回值参与函数名修饰规则是因为,返回值是没有办法传过去的,而实参是可以传给形参然后确定参数去进行匹配的。

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

另外上面这两个函数虽然构成了重载,但是会有歧义,上面这个函数可以无参调用,而下面这个函数也可以无参调用,这时候如果去调用无参的函数,编译不通过的。
在这里插入图片描述