博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++返回引用是否是真的引用
阅读量:5319 次
发布时间:2019-06-14

本文共 1375 字,大约阅读时间需要 4 分钟。

c++返回的引用是真的引用吗?

当然了,这不是屁话吗,然而

int& Test() {    static int a=0;    std::cout << a << std::endl;    return a;}int _tmain(int argc, _TCHAR* argv[]){    int b = Test();  // 输出0    b = 1;    Test();  // 还是输出0    getchar();    return 0;}

返回的是引用(注意a必须是static),但是修改了b却没有能够修改a,这是为什么?

首先Test函数返回了一个int&,这个int&是一个临时对象,但是operator = 会创建新的对象,b是新的对象,而不是a的引用,所以修改b对a无效。

那怎样才能修改b即使修改a呢,当然可以返回指针,另外,还可以把b也定义为一个引用,

int _tmain(int argc, _TCHAR* argv[]){    int &b = Test(); // 输出0    b = 1;    Test();  // 输出1    getchar();    return 0;}

这样临时变量是a的引用,b是临时变量的引用,b即是a的引用,修改b即是修改a。

对类类型也是一样,只不过类类型的赋值比较复杂。

class MyClass{public:    MyClass():num(0) {        std::cout << "MyClass()" << std::endl;    }    MyClass(int n) :num(n) {        std::cout << "MyClass(int n)" <
MyClass Test() {    static MyClass myclass1;    myclass1.Show();    return myclass1;}int _tmain(int argc, _TCHAR* argv[]){    MyClass myclass2 = Test();  // 条用了复制构造函数    myclass2.set_num(1);    Test();    getchar();    return 0;}

结果自然不能修改myclass的内容,注意到,赋值操作还调用了复制构造函数。

把Test改为返回引用

MyClass& Test() {    static MyClass myclass1;    myclass1.Show();    return myclass1;}

结果同上,而且同样调用了复制构造函数。这是因为,赋值操作创建了临时变量,临时变量是myclass1的引用,之后调用复制构造函数构造了myclass2,所以myclass1 和myclass2是不同的对象。

将myclass2也改为引用

MyClass &myclass2 = Test();    myclass2.set_num(1);    Test();

这样myclass1和myclass2就是同样的对象了

转载于:https://www.cnblogs.com/clark-lee/p/3900715.html

你可能感兴趣的文章
软件开发模型之瀑布模型
查看>>
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
查看>>
封装CoreGraphics的API简化绘图操作
查看>>
sqlserver 判断字符串是否是数字
查看>>
[poj] 3977 Subset || 折半搜索MITM
查看>>
单例设计模式---懒汉式的多线程安全隐患
查看>>
JSP复习整理(四)Cookie
查看>>
iphone传照片还是用QQ比较好
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
Python默认调用路径
查看>>
启动redis一闪就关
查看>>
Maven之setting.xml配置文件详解
查看>>
python简单小常识
查看>>
可视化框架设计-图表类型
查看>>
HDU1823 Luck ans Love 二维线段树
查看>>
富数据控件 DetailsView 和 FormView
查看>>
ASP.NET 4.5 Web Forms and Visual Studio vs2013年入门1
查看>>
JUC - ReentrantLock 的基本用法 以及 lock()、tryLock()、lockInterruptibly()的区别
查看>>
《那一世》
查看>>
迷你DVD管理器
查看>>