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就是同样的对象了