1.命名空间
1.1命名空间的定义
在C中,是不允许存在想用名字的变量名,函数名,这会导致冲突。而C++中引入了命名空间的概念,对标识符进行本地化,解决了命名冲突的问题。namespace这个关键词就是解决改问题。
定义一个命名空间:定义命名空间需要namespace的关键词+名字+{}就可以定义好一个命名空间。{}中的成员就是命名空间的成员。
注意:命名空间定义了一个新的作用域,命名空间中的内容就局限于改作用域中。同时一个工程中若出现两个相同命名空间的名字,编译器会将他们合并。
1.2命名空间的使用
命名空间的成员使用可以分为三种情况。
1、局部展开
使用using 进行局部展开 z3为名字 ::为域作用限定符 a为其中的变量。
2、全局展开
使用using namespace +名字 就是将命名空间的全部内容进行展开。这时候容易造成重命名的问题,自己练习的时候可以这样做,但是写项目的时候不要这样写,容易出现问题。
3、用命名空间名字+作用域限定符
2.输入与输出
C中的第一堂课就是学习对自己的问候,用打印函数输出"hello word!"。C++也有关于自己的的输入与输出函数。来看看C++是如何进行自己的输入输出的。
1.使用cout标准输出对象(c的prinf)和cin标准输入对象(c的scanf),必须包含头文件<iostream>以及命名空间std(c++标准库)。
2.cout与cin是全局流对象,end1为特殊的C++符号表示换行。
3.<<为流插入符号,>>为流提取符号。
4.C++的流插入和提取是不需要控制个数,所以会比C方便一些。
3.缺省参数
缺形函数是在定义函数或函数声明的时候指定一个缺省值,当函数没有传入实参,会用缺省值进行代替,否则就使用实参。
缺省有两个分类:1、全缺省参数。
2、半缺省参数。
3.1 全缺省参数
全缺省参数:
3.2半缺省参数
半缺省参数:
注意:1、函数传参的时候参数应该从左往右连续,不可有间隔。
2、函数定义或声明的时候半缺省参数也应该从右往左连续
3、实参需是常量或全局变量
4、函数声明或定义只能出现一个缺省参数的定义。
4.函数重载
4.1函数重载的概念
函数重载:函数重载是一种特殊的情况。C++中允许同一作用域中声明几个功能类似的重名函数,这些函数的形参列表(类型,个数,类型顺序)不同,都可以构成函数重载。
注:返回值的类型不会影响函数重载,因为编译器不能确定这是什么返回类型,是否有返回类。
4.2 C++中为什么支持函数重载
一个项目是由多个头文件和多个源文件构成。在链接编译阶段,我们在A.cpp中调用B.cpp的ADD函数时。编译还未链接前 A.o的目标文件未找到ADD的地址,因为ADD是在B.o的文件中。在链接阶段就是用来处理该问题,链接器看到A.o中调用了ADD,ADD没有地址,就会调用B.o的符号表找到ADD将他们链接一起。那么链接时,面对ADD这个函数,编译器会用什么名字来找呢?不同编译拥有不同的规则。
因为window命名规则过于复杂,所以用Linux下g++演示。、
采用c语言编译后:
在 C中,寻找ADD函数是直接运用ADD函数名本身,所以不支持函数重载。
采用C++编译后
在c++中,函数修饰使用Z+函数长度+函数名+类型首字母
5.引用
5.1概念
引用不是定义一个新的变量,它是给一个已经存在的变量取一个别名(类似与指针)。编译器不会给引用开辟一个内存空间,它和变量公用一块地址。
引用的使用方式:类型 & 名字=引用实体。
5.2引用特性
1、引用只能引用一个实体
2、一个变量可以多次引用
3、引用定义必须有初始化
5.3常引用
5.4使用场景
1、做返回值
2、做参数
注:引用会比传值的效率更高。(可以自己使用clock()进行测试)
5.5指针与引用的区别
从语法概念上,引用没有开辟一块新的空间,而指针开辟了一块新的空间。
在底层上,引用是指针的另外一个概念,实际上是有一块空间的。
引用与指针的区别:
1、引用需要初始化,而指针可以不进行初始化。
2、引用是概念上的一种别名,指针存储变量的地址。
3、sizeof算引用算的是引用那个变量的类型大小,而指针算的是地址。
4、引用只能引用一个实体,而指针变量可以指向任一同一类型的实体。
5、指针++是类型变量大小的++,而引用++就是实体+1.
6、引用没有多级引用,指针有多级引用
7、无空引用却有空NULL
6.内联函数
通过inline修饰的函数也叫内联函数。C++编译期间,调用inline修饰函数的地方,会进行展开,没有函数调用时开辟栈帧的开销。
inline是一种用空间换时间的做法,它会提升效率,但会浪费时间。
inline修饰的函数会跟宏一样进行替换展开,如果函数过多会使文件变大,但是会减少空间上的开销。inline对于编译器来说只是一个建议。不同编译器关于liline的建议也不同,一般建议:频繁调用,使用直接,行数少,不是递归函数的函数采用inline。编译器会自己判断是否同意建议。
如果inline修饰的函数,函数行数大于75行,或者是递归函数,不太可能进行内联展开。