zoukankan      html  css  js  c++  java
  • 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&是一个临时对象,但是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)" <<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就是同样的对象了

  • 相关阅读:
    设置Centos7会话超时时间
    Shell浮点运算
    Maven 同一依赖多版本共存
    Java根据模板生成word
    Java条形码生成
    arcgis for js 4.x 悬浮显示popup
    tomcat 跨域配置
    Mysql8.0 版本 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',报错
    volatile
    synchronized
  • 原文地址:https://www.cnblogs.com/clark-lee/p/3900715.html
Copyright © 2011-2022 走看看