第一部分 C++入门
1.命名空间
命名空间实际上就是为了防止命名相同会导致很多的冲突,可以使用命名空间对标识符进行本地化,来避免命名的冲突
使用方式:
1.加命名空间名称及作用域限定符std::cout<<"hello world"<<std::endl;
,特点是比较麻烦,但是它是最规范的方式
2.用using namespace 命名空间名称引入using namespace std;
,把std整个展开,相当于库里的东西都到全局域了,看起来是方便了,但是如果我们自己定义的东西和库里的东西冲突了就没办法解决了。
3.使用using将命名空间中成员引入using std::cout;
,对库里常用的东西进行展开,折中了方法1和方法2。
注:
1.命名空间中的内容可以定义变量也可以定义函数
2.命名空间可以嵌套
3.同一个工程中可以存在多个相同的命名空间,编译器会在最后合成同一个命名空间
4.一个命名空间定义了一个新的作用域,其中的所有的内容都局限于该命名空间中
2.缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。缺省参数的作用就是:调用的时候更加灵活。
缺省参数可以分为:
1.全缺省参数
2.半缺省参数
注:
1.半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现(如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值)
3.缺省值必须是常量或者全局变量
4.C语言不支持(编译器不支持)
3.函数重载
是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
int Add(int x,int y); double Add(int x,int y);
这两个函数不是函数重载,它们只是返回值不同。
为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经过预处理、编译、汇编、链接四个过程,项目通常是由多个头文件和多个源文件构成。
以Add函数来说,假如Add函数的定义在a.cpp,而在b.cpp中使用了Add函数,当这两个文件分别生成了各自的目标文件a.o,b.o,此时在b.o中是找不到Add函数的地址的,那么经过最后一步链接,b.o就会去a.o的符号表中去找Add函数的地址,然后链接到一起,而此时链接器则用的是经过特殊命名规则修饰过的名字到符号表中去找,而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】,这里只要函数的参数不同,那么在符号表中的函数名就会不同,而C语言就没有这样的一套函数名修饰规则,所以在C语言中尽管函数名相同函数参数不同,在符号表中的函数名是相同的,这是当我们想要调用这一函数时,系统就不知道该去调用哪个函数,所以C语言时不支持函数的重载的。
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
extern"C":用C的函数名修饰规则
有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译。tcmalloc是google用C++实现的一个项目,他提供tcmallc()和tcfree()两个接口来使用,但如果是C项目就没办法使用,在C项目中,函数名没有修饰规则,而C++函数有,就导致C语言的编译器无法找到对应接口的经过修饰的函数名,这时可以在函数前加上exter"C",使得该函数按照C的风格来编译。
4.引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。在语法上,这里是取了一个别名,没有新开空间,实际从汇编实现的角度,引用的底层也是类似指针存地址的方式处理的。
注:
1.引用类型必须和引用实体是同种类型的
2.引用在定义时必须初始化
3.一个变量可以有多个引用
4.引用一旦引用一个实体,再不能引用其他实体
常引用问题:
再谈隐式类型转换:
隐式类型转换转换时不是直接转换,而是先创建一份要转换类型的临时变量,随后赋值给这块临时变量。
假如存在常量 const int a = 10;
我们在对a进行引用时需要加上const,const int& ra = a;
此外,临时变量具有常性,在类型不同的变量间引用时要加上const。 const int& ra = b;
引用使用场景:可以作函数传参或者函数返回值,如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
传值、传引用效率比较:以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或