https://www.cnblogs.com/tp-16b/p/8619813.html
C++引用指针 & 构造函数
阅读目录
近来回转 C++的学习,脑子又被搞得了一团迷(简直不要忘得太快..... )
过后静下来想一想,还是因为有些东西没搞清楚导致,所以理了理两个容易搞迷糊的地方。
引用与指针
C++进行传值更倾向于使用引用。引用实质就是给已经定义的变量起一个别名,函数通过这个别名来完成对应的功能。
【引用特点】
①一变量可取多个别名
②引用必须初始化,同时只能在初始化时被引用,
③只能被引用同一变量,从一而终
【使用引用注意几种情况】
(1)何时添加const进行修饰
①防止引用变量被修改
我们知道在变量前加const 表示这是个常变量,不能被修改。那么在引用前加上const是一样的道理,例如: int a = 2; const int& d = a; 这样的形式防止变量a的别名d 对值‘2’进行修改。
②引用的为常量 如:
常量是具有常性的,所以必须在前面加上const使其保持常性。
③引用参数存在隐式类型转换
(2)函数传引用作返回值
①不要返回临时变量的引用
例如
int& Add(int d1, int d2) //临时变量的引用作返回值 { int ret = d1 + d2; return ret; } void Test() { int& sum = Add(1, 2); //获取返回值ret的别名 cout<<"占用位置"<<endl; cout<<sum<<endl; } 结果:
分析:ret是隶属于Add函数栈帧,ret的引用作返回值,返回的其实是ret变量的地址;而当Add函数调用完毕后,该处被操作系统收回权限,若再通过返回的地址访问该处就是非法的(结果便成了上图随机值)。这与传值返回有着很大的差别,
(传值返回&引用返回 汇编代码)
②当返回的对象出了函数作用域依旧存在,最好使用引用作返回,因为它更高效。
因为引用返回仅仅是一个别名(其实是保存在寄存器eax中的地址),而若是传值返回,且返回的ret是一个对象,便会产生临时对象,这个临时对象用ret拷贝构造初始化(拷贝构造请往下看),而这个临时对象底层是在返回值接收方的函数中提前开辟好的,在函数接受方接收完成后,还需调用析构函数来清理该临时对象,进一步增大了开销;所以用引用返回会更高效。
注:返回值优化参考http://www.cnblogs.com/hazir/archive/2012/04/19/2456840.html
然后就是注意它和指针的区别(比较重要)。
【引用和指针区别】
* 引用只能在定义时初始化一次,之后不能改变去指向其它变量(从一而终);指针变量的值可变
* 引用必须指向有效的变量,指针可以为空;用指针传参,函数栈额外开空间来拷贝一份参数地址,引用传参则不会。
* sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
* 指针和引用自增(++)自减(--)意义不一样。
总之, 相对而言,引用比指针更安全,指针更灵活。