C++引用指针 & 构造函数

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指针是对象地址的大小。
  * 指针和引用自增(++)自减(--)意义不一样。

 

 总之, 相对而言,引用比指针更安全,指针更灵活。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值