c++返回引用是否是真的引用

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&是一个临时对象,之后把临时对象的值赋给了b,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)" <<std::endl;
    }
    MyClass(const MyClass &rhs) {
        std::cout<< "MyClass(const MyClass&)" << std::endl;
        num = rhs.num;
    }
    void Show() {
        std::cout << num << std::endl;
    }
    void set_num(int n) {
        num = n;
    }
private:
    int num;
};
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就是同样的对象了

c++返回引用是否是真的引用

时间: 2024-10-12 13:10:22

c++返回引用是否是真的引用的相关文章

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &

基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------&gt; 可以返回派生类对象的引用或指针

您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 http://bbs.csdn.net/topics/380238133 的作者无关,不对其内容负责.百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面. 首页 精选版块 移动开发 iOS Android Qt WP 云计算 IaaS Pass/SaaS 分布式计算/Hadoop J

引用返回左值及其判断引用有效性的方法

在使用Ubuntu作为开发环境时经常需要在全局安装一些依赖框架等,这个时候就常常需要用到root权限,但是在Ubuntu下第一次使用su命令时会提示认证失败:查找资料后发现Ubuntu下root权限默认是锁定的,可能是处于安全考虑,但是作为开发人员肯定是需要root权限的. 在命令行中可以输入下面命令设置root密码,这样就能随时使用root权限了: [email protected]:~$ su 密码: su:认证失败 [email protected]:~$ sudo passwd [sud

JNI/NDK开发指南(十)——JNI局部引用、全局引用和弱全局引用

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44657385 ????这篇文章比较偏理论,详细介绍了在编写本地代码时三种引用的使用场景和注意事项.可能看起来有点枯燥,但引用是在JNI中最容易出错的一个点,如果使用不当,容易使程序造成内存溢出,程序崩溃等现象.所以讲得比较细,有些地方看起来可能比较啰嗦,还请轻啪!下一篇文章会写一个在Android由于JNI引用使用不当,造成局部引用表溢出而导致程序闪退的案例,请关注! ????做Java

详解C++引用——带你走进引用的世界

 一.介绍引用 首先说引用是什么,大家可以记住,引用就是一个别名,比如小王有个外号叫小狗,他的妈妈喊小狗回家吃饭,那就是在喊小王回家吃饭. 接下来我们用两行代码来声明一个引用(就拿小王和小狗来说吧): int xiaoW; int &xiaoG=xiaoW; 上面就是一个引用,说明几点要注意的地方: 1.&不是取地址符,而是引用运算符: 2.xiaoG是xiaoW的别名,所以这两个变量的值和地址都是一样的: 3.引用只能初始化,而不能先声明再赋值,因为引用就相当于一个常量: 4.在声明

php变量的引用及函数的引用

Php变量的引用及函数的引用放回 变量的引用    $a="ABC";    $b =&$a;    echo $a;//这里输出:ABC    echo $b;//这里输出:ABC    $b="EFG";    echo $a;//这里$a的值变为EFG 所以输出EFG    echo $b;//这里输出EFG 函数的引用返回function &test(){    static $b=0;//申明一个静态工程变量    $b=$b+1;   

NDK开发之引用(局部引用,全局引用,虚全局引用)

1.先引出我遇到的一个问题(我觉得先写问题,这样印象更深刻一点): Android Java层在调用本地jni代码的时候, 会维护一个局部引用表(最大长度是512), 一般jni函数调用结束后, jvm会释放这个引用, 如果是简单的函数不注意这些问题,让他自己释放,基本是没有什么问题, 但是如果函数里面有循环的操作的话,那么程序就会有崩溃的隐患, 比如 之前我在项目里面就有在一个jni方法里面,将native层的一个队列封装成Java层的List,然后返回给Java层使用, 这样的话,不可避免的

C++ 11中的左值引用和右值引用

1.首先区分左值和右值    左值是表达式结束后依然存在的持久对象    右值是表达式结束时就不再存在的临时对象    便捷方法:对表达式取地址,如果能,则为左值,否则为右值举例:    int a = 10    int b = 20    int *pFlag = &a    vector<int> vctTemp    vctTemp.push_back(1)    string str1 = "hello"    string str2 = "wo

WPF中静态引用资源与动态引用资源的区别

WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”,而第1个按钮的文字没有变化. 原因是第1个按钮文字用的是静态引用资源,而第2个按钮文字用的是动态引用资源. 前台代码: <Window x:Class="PersonalLearning.StaticDynamicResourceDemo"        xmlns="http