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