引用的使用场景//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修饰的引用,不能修改
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声明的变量必须由编译器在编译时期推导而得 。
经验总结扩展阅读
- 手机怎么把QQ空间说说一次性全删掉(qq如何恢复删掉的说说)
- 怎么一次性删掉QQ空间里的全部说说(翻看以前qq空间的说说)
- 怎么把空间说说全部清空(qq空间一键清空所有说说)
- 手机QQ空间怎么一次性删除说说求解(怎么一键删除qq说说)
- qq空间说说怎么全部删除(怎样一键清空qq空间)
- 小户型卧室如何设计 小户型卧室空间布局设计
- 恋梦空间郭蓉和谁在一起了?
- 空间站是静止的还是运动的
- 如何注销空间 1980717Z空间
- qq空间说说怎么全部删除(qq空间说说一键恢复)