命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶( 八 )

引用的使用场景//1.作为函数的参数void func(int &a, int &b){ cout << a+b << endl;}//2.引用作为函数的返回值int& func2(){ int b = 10;//不能返回局部变量的引用 int &p = b; return p;//错误的}int& func3(){ static int b = 10; return b;}void test01(){ int& q = func2(); cout << q << endl; q = 100; cout << q << endl; func2() = 200; cout << q << endl; cout << func2() << endl;//--------------上面的代码都是错误的,这里解释一下//int& q = func2();实际上就是int&q = p,但是fun2函数执行完了之后,局部变量全部被销毁了,所以int&q = 就指向了一个非法的区域,但是编译器没有检测出来,具体原因是什么不清楚 func3() = 100; cout << func3() << endl;}引用做返回值时,一般分两种情况:返回的对象未归还系统和返回的对象归还系统 。如果返回对象不归还系统,我们可以引用返回,否则就需要传值返回
想要返回局部变量:1.把局部变量写在堆区 2.把局部变量写在静态区
常引用注意:

  • 字面不能赋给引用,但是可以赋给const引用
  • const修饰的引用,不能修改
//普通引用int a = 10;int &ref = a;ref = 20;//int &ref2 = 10不能给字面量取别名,因为10这个字面量在内存中没有空间,存储在寄存器中//常引用const int &ref3 = 10;//可以给const修饰的引用赋予字面量//编译器会把上面的代码变为:int tmp = 10;const int &ref3 = tmp;内联函数以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率 。
inline int Add(int x, int y){ return x + y;}int main(){ int z = Add(1, 2); return 0;}如果加了inline关键字,编译器在编译期间会用函数体替换函数的调用(类似于宏定义,在编译阶段就替换函数调用,将函数调用直接展开,减少了调用的时间,但是空间消耗巨大) 。
下面是内敛函数的几个特性:
1.inline是一种以空间换时间的做法,省去调用函数额开销 。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数 。2.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联(是否称为内联函数由编译器决定) 。3.inline不建议声明和定义分离,分离会导致链接错误 。因为inline被展开,就没有函数地址了,链接就会找不到 。
例子:一个相同的函数,一个加了inline 关键字,一个没加,加上一个函数要执行10条指令,文两个函数分别调用1000次要执行多少条指令?普通函数:1000+10(一次调用1次指令,加起来就是1000条,每次调用都是call函数,函数不展开就是10条)内联函数:1000*10条指令(展开就是每次调用都是10条指令)所以说,内联函数展开,会让程序变大,所以代码很短的函数可以考虑有内联,长函数和递归函数不适合用内联 。
auto关键字C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得 。

经验总结扩展阅读