程序如下: #include <iostream> using namespace std; class C { public: void set( int n ) { num = n; } int get() { return num; } private: int num; }; C& g() { C c3; c3.set( 123 ); return c3; } int main(){ cout<<g().get()<<endl; return 0; } 请问各位大侠,输出的结果并不是123。而是别的值。我有两个问题,1.为什么结果不是123?2.那就目前程序输出的那个结果什么东西?谢谢~~
问题补充:
如果把g()改成C类型而不是C的&,那么程序是没问题的,关键就在于为什么改成C&就不能正确输出?先谢过一二楼的朋友,但还是不够深入,请各位大侠继续指点下我吧。多谢! 如果是说return c3执行完后c3便被清楚了,那我定义g()函数为int类型为什么却可以正确读取呢?比如 int &g(){ int i=5; return i; } 在main函数中调用g()可以正确打印5,请问这跟上面的程序有什么区别呢?谢谢~~
引用就是变量的别名,返回c3的引用,返回的就是c3 ,c3被清除,再调用c3的函数,结果当然不正确; 如果返回 i 后,i被清除,但是返回值已经被输出了,结果是正确的; 返回C类型,g函数返回 的是C类型的一个对象,虽然c3被清除,但是返回的对象还能调用get函数 你可以在C类中增加一个析构函数,调试运行,你会发现,g函数里执行了一次析构函数,然后get函数后又发生了一次析构 慢慢理解吧,很难讲清楚啊