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