文章目录
C++与C语言的区别
C++在保留了C语言所有特性的基础上增加了面向对象编程的支持,并引入了更多的高级特性和工具来提高代码的可读性、可维护性和可扩展性。而C语言则更加简洁和底层,适用于对性能要求极高或对内存管理有严格要求的场景。
命名空间(Namespace)
在C++中,命名空间是一种封装事物的方式,它可以包含类、函数、变量等。命名空间的主要目的是防止名称冲突,使得代码更加模块化和清晰。你可以把命名空间想象成一个“容器”或“文件夹”,它将相关的代码元素组织在一起,并与其他命名空间隔离开来。
为什么需要命名空间?
随着程序变得越来越复杂,特别是当使用多个库或模块时,很可能会出现名称冲突。例如,两个不同的库可能都有一个名为compute的函数。如果没有命名空间,编译器将无法区分这两个函数,从而导致编译错误。命名空间通过为每个库或模块提供一个唯一的“标签”,从而解决了这个问题。
观察以上两图可以看到,因为全局变量rand与<stdlib.h>这个库函数里的函数rand同名了,所以报错显示重定义,而使用命名空间就可以避免这个现象。
如何定义命名空间?
在C++中,需要使用namespace关键字,后面跟命名空间的名字,然后接一对 { } 即可,{ } 中即为命名空间的成员。下面是一个简单的例子:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6415d44e6da7459688590f7f5447d99f.png
这里space是该命名空间的名字,也可以取别的名字,如果要使用该命名空间的成员就在成员名前面加上命名空间的名字:: ,如上图就是space:: ,这样就不会重定义了。
命名空间可以定义变量/函数/类型等,如下图
命名空间也可以嵌套使用
同一个工程中允许多个相同名称的命名空间,编译器最后会合成同一个命名空间中
一个工程中的test.h和上面test.cpp中两个
在讲命名空间的使用之前,先讲一下C++中的域。
C++中有四种域:局部域,全局域,命名空间域,类域,本文章只讲前三种
一般情况下,查找的优先级为局部域 > 全局域 > 命名空间域
下图打印出了1,因为先查找的是局部域
默认的查找规则下,是先局部,后全局,但是不会默认去命名空间里查找
::表示域作用限定符
一旦你指明了域,那它就不会去其他地方找了
域作用限定符,前面如果不加任何东西,就表示访问全局
每次使用命名空间里的数据都需要写space::比较麻烦,所以就有了展开命名空间
如果该变量只存在于命名空间内,展开命名空间后就不需要写space::而是可以直接使用了
如果在命名空间,全局域,局部域同时存在相同的变量,那如果不用space::就会查找局部域,还是遵循局部优先原则
如果注释掉局部变量,这时就会报错,因为它是展开到了全局,展开命名空间本质上:给了查找的权利—查找优先级和全局域是一致的 ,因为优先级相同,在没有指定的情况下就不知道查找哪个,如果要查找全局域就在变量名前加上:: ,如果要查找命名空间域就在变量名前加上space:: ,这个space只是这个命名空间的名字,名字可以随意取
还可以只展开指定部分,下图因为指定展开了a变量,所以可以使用a变量,但是因为没有展开b变量,所以会显示未定义
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参
下图中F1函数中形参a就表示缺省,1就是它的缺省值
全缺省就是形参中都被赋值了
缺省只能从右往左缺省,因为传参数是从左往右进行的
在缺省函数里传参要按顺序传,不能跳跃着传,否则会报错
缺省参数不能声明和定义同时给,声明和定义任意给一个即可
缺省值相同或者不相同都会显示重定义
↓缺省值相同
↓缺省值不相同
缺省函数有一个很重要的功能就是方便扩容,如链表或者栈中的扩容环节