👑个人主页:啊Q闻
🎇收录专栏:《C++》
🎉我自会去见我的山
💡感谢阅读,欢迎关注,点赞,收藏,评论💡
前言
这篇博客是对C++的一个初步认识,这个认识是基于C语言的基础上初识C++,C++部分是对C语言设计不合理的地方进行了优化,今天我们就要学习一下。
一.命名空间
1.为何会出现命名空间?
在用C语言编写代码时,我们有时候会遇到定义两个相同的变量,在同一个域中是不可以定义两个相同的变量的,不同域中可以定义相同的变量名。
例如:全局域中与局部域中均用变量a定义,但是当全局域与局部域中均定义a时,我们打印a是打印哪个a的值呢?
如上结果显示:其打印的是局部域的值。这是因为,打印时,其会先在局部域中寻找,然后再在全局域中查找,所以我们打印的是局部域的值。
如果我们要打印全局域的值,又当如何操作呢?
在C++中,如果要打印全局域中的a,我们只要在用::a
变量名的定义会存在冲突,函数名的定义也会存在冲突。不一样的是,函数名的定义冲突是在我们定义的函数与库之间存在重复命名,我们将这种冲突称为命名冲突。
例如:
出现上面情况的原因是:在stdlib.h库中本来就存在rand函数,然而我们又用变量名rand,造成了命名冲突。那该如何让解决呢?总不能让我们了解每个库中存在的函数名,使用变量时进行规避吧?
2.初识命名空间
为了解决上述问题,C++定义出命名空间,使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染。
定义命名空间,我们要用到关键字namespace,利用namespace+命名空间的名字实现定义。
定义一个命名空间就相当于定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
如图,利用namespace就不会出现命名冲突了,就相当于你划定一块固定的地方叫aqw,然后在aqw中找寻rand,命名空间的名字可以根据由自己编写。
此外,命名空间可以嵌套,例如:
打印时,我们查找首先是在局部域中,再在全局域中,最后在命名空间中。
3.命名空间的使用
我们在使用命名空间时,有三种使用方式:
(1)加命名空间名称及作用域限定符
(2)使用using将命名空间中某个成员引入
(3)使用using namespace命名空间名称引入
二.C++输入输出
1.C++中,使用cout标准输出对象和cin标准输入对象,std是C++标准库的命名空间名,cout和cin的命名空间均为std,其必须包含头文件iostream。
2.endl是标准的C++符号,其表示换行输出,头文件为iostream。
3.<<是流插入运算符,>>是流提取运算符。
4.C++输入输出都不用像C语言,C++不用手动控制输入输出格式,其会自动辨别变量类型。
示例:
三.缺省参数
1.初识缺省参数
概念:缺省参数是声明或定义函数时为函数的一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省,否则使用实参。
2. 缺省参数的分类
缺省参数分为全缺省参数和半缺省参数:
(1)全缺省参数:遵循从左往右传
(2)半缺省参数 :半缺省参数是指缺省一部分,其规定只能从右向左传,且不能跳跃着传。
四.函数重载
1.初识函数重载
函数重载是函数的一种特殊情况,C++中允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(形参个数/类型/类型顺序)不同,常用于处理功能类似但是数据类型不同的问题。
对于函数重载,其函数名,变量名要相同,返回值不是判断是否为函数重载的必要条件。
1.参数类型不同
2.参数个数不同
对于参数个数不同的函数重载的情况,有一种情况要注意一下:
缺省参数和无参两种情况构成函数重载,但是其调用时会存在歧义。因为当调用函数时,当不给函数传形参,我们无法确定此时调用的是无参函数?还是调用缺省参数(用的是参数的默认值)?
3.参数类型顺序不同
2.函数重载原理
为什么C语言不支持函数重载?然而C++支持函数重载?
这是因为,在C语言中,编译器编译后,函数名字的修饰没有发生改变,然而在C++中,会通过函数修饰规则来区分,只要参数不同,修饰出来的函数名字就不同,也就支持了函数重载。