目录
1.命名空间
c++兼容c,所以我们很多c语言中的语法格式和习惯在c++中是支持的。c++之所以出现,是因为祖师爷觉得c语言有很多需要改进的地方,因此出现了c++。
首先,我们在学习c语言的时候,经常会遇到命名冲突的情况。这种情况来源于程序员对于变量或者函数的命名,与库之间的命名发生冲突。c语言给出的解决方案比较传统,就是修改名字。祖师爷觉得很麻烦,引出了命名空间的概念。
不同的命名空间相当于不同的域,我们知道,c语言中,不同的域可以定义相同名字的变量,但是遵循就近原则,局部的变量是优先于全局的变量的。编译器会优先从局部查找变量,如果没有,就从全局域查找。
编译器的搜索原则,首先在局部域查找,没有就去全局域查找,如果有指定域,就直接去指定域去查找,因此我们引入域作用限定符-----" :: "。
如果域作用限定符左边什么都没有,就代表访问全局域。如果有命名空间,就去该命名空间去查找。
因此,命名空间解决了程序员与库命名冲突的问题,相同的命名空间里的内容会合并,因此我们可以有两个相同名字的命名空间,但是要避免命名相同的情况,命名空间也是支持嵌套的,一定程度上也解决了命名冲突的问题。命名空间中可以定义变量,函数以及结构体。
区别头文件和命名空间
2.输入输出
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。 2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。 3. >是流提取运算符。 4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。 5. 实际上cout和cin分别是ostream和istream类型的对象,>>和格式,后续编译器已不支持,因 此推荐使用+std的方式。
注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应 头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间, 规定C++头文件不带.h;旧编译器(vc 6.0)中还支持格式,后续编译器已不支持,因 此推荐使用+std的方式。
3.缺省参数
缺省参数是声明(通常在声明的地方给缺省参数)或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
缺省参数也分全缺省参数和半缺省参数,全缺省参数即全部缺失,半缺省参数即部分缺失。
1.半缺省参数必须从右往左依次来给出,不能间隔着给 2. 缺省参数不能在函数声明和定义中同时出现,一般在声明处给缺省参数。
4.函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重 载了。函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
c语言是不支持函数重载的,cpp又是如何支持函数重载呢?
c语言链接时,直接用函数名去找地址,有同名函数,区分不开。而cpp支持函数名修饰规则,名字中引入参数类型,各个编译器自己实现了一套。cpp用修饰过的函数名,去找地址,可以实现函数重载。
5.引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。
类型& 引用变量名(对象名) = 引用实体;
引用特性 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 引用一旦引用一个实体,再不能引用其他实体(不能改变指向,只能改变赋值)。
指针和引用的功能是类似的,重叠的。c++的引用,对指针使用比较复杂的场景进行一些替换,让代码更简单易懂,但是不能完全替代指针。因为引用定义后,不能改变指向。
引用的使用场景:以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。当引用作为返回值时,返回值出了函数作用域就声明周期到了要销毁(局部变量),不能用引用返回。全局变量,静态变量,堆上变量等就可以。
引用和指针的不同点:
1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体
4. 没有NULL引用,但有NULL指针
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)
6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
常引用
权限放大不可以,权限缩小是可以的。
6.内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。如果函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
内联函数特性:1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会 用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运 行效率。 2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。
7.auto关键字
auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。
在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。