2 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個贊
我來回答你的問題,很簡單,你的代碼需要修改為:
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout<<"構(gòu)造函數(shù)執(zhí)行\(zhòng)n";x=i;}
A(A&a){cout<<"復(fù)制構(gòu)造函數(shù)創(chuàng)建對象\n";x=a.x;}
~A(){cout<<"析構(gòu)函數(shù)\n";}
int get()const{return x;} //因?yàn)榈?2行代碼A&r=&func();改為了const A&r=func();此處必須加const。
private:
int x;
};
A func()
{
cout<< " 跳轉(zhuǎn)到func函數(shù)中"<<endl;
A a(23);
cout<<"a 的地址"<<&a<<endl;
return a;
}
int main()
{
const A&r=func(); //r是一個類A的引用,func()函數(shù)返回的是一個類A的對象,不是指針,func()函數(shù)前不要&。引用必須和對象綁定,不能和數(shù)值或計(jì)算式綁定,否則要加const。(早期的編譯器如:VC++6.0可以寫成A &r=func(),現(xiàn)在的編譯器都不支持)
cout<<r.get()<<endl;//r不是指針,要改成r.get()
cout<<"a 的地址"<<&r<<endl;//r是一個類A的引用,輸出r地址應(yīng)改為&r
system ("pause");
return 0;
}
最后回答你func()函數(shù)返回的是一個臨時對象,為什么“cout<<r.get()<<endl;”還能得到23?
因?yàn)閷τ谝枚?,如果引用的是一個臨時變量,那么這個臨時變量的生存期會不小于這個引用的生存期(可參見C++標(biāo)準(zhǔn)[class.temporary])。也就是說,直到main函數(shù)結(jié)束時,引用r的生存期才結(jié)束,所引用的臨時變量的生存期也才結(jié)束。
需要特別說明的是以上代碼在Dev c++和vs2017的運(yùn)行結(jié)果是不一樣的。vs2017會調(diào)用復(fù)制構(gòu)造函數(shù),func()函數(shù)返回的是對象a的副本;Dev c++不會調(diào)用復(fù)制構(gòu)造函數(shù),func()函數(shù)返回的是對象a本身。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個贊
稍微修改了你的代碼,得到了正確的結(jié)果
#include <iostream>
using namespace std;
class A
{
public:
A(int i){cout<<"構(gòu)造函數(shù)執(zhí)行\(zhòng)n";x=i;}
A(A&a){cout<<"復(fù)制構(gòu)造函數(shù)創(chuàng)建對象\n";x=a.x;}
~A(){cout<<"析構(gòu)函數(shù)\n";}
int get(){return x;}
private:
int x;
};
A* func()
{
cout<< " 跳轉(zhuǎn)到func函數(shù)中"<<endl;
A* a = new A(23);
cout<<"a 的地址"<<&a<<endl;
return a;
}
int main()
{
A* r = func();
cout<<r->get()<<endl;
cout<<"a 的地址"<<r<<endl;
system ("pause");
return 0;
}
按照你的改動,我的dev-cpp也還是不能編譯,感覺這么改正規(guī)一點(diǎn),函數(shù)返回值返回一個指針才能在后用執(zhí)行->運(yùn)算符吧
補(bǔ)充:
這里可能是調(diào)用了隱式的拷貝構(gòu)造函數(shù),因?yàn)槟泔@式定義的拷貝構(gòu)造函數(shù)不能完成A& r = func();這一句的拷貝構(gòu)造。因此編譯器為你隱式的定義了屬于A& r = func();這種調(diào)用方法的拷貝構(gòu)造函數(shù)。
另外a確實(shí)在函數(shù)局部被析構(gòu)了,但這發(fā)生在return語句之后,return語句已經(jīng)將a返回給了A& r,r.get()依然能返回23
- 2 回答
- 0 關(guān)注
- 344 瀏覽
添加回答
舉報(bào)