第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

下面這段代碼在VC++中可以編譯運(yùn)行,為什么在Dev-c++不能編譯運(yùn)行?咋回事?

下面這段代碼在VC++中可以編譯運(yùn)行,為什么在Dev-c++不能編譯運(yùn)行?咋回事?

C C++
哆啦的時光機(jī) 2022-11-04 16:13:24
#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(23);cout<<"a 的地址"<<&a<<endl;return a;}int main(){A&r=&func();cout<<r->get()<<endl;cout<<"a 的地址"<<r<<endl;system ("pause");return 0;}如果在func函數(shù)前面加上引用,A &func() devc++就可以編譯了??墒莂出去不是空引用么?怎么會得到a的值呢?A&r=func(); //這前面沒有&cout<<r.get()<<endl; //這里不是指針 用的是"."cout<<"a 的地址"<<&r<<endl; //這里是&rsystem ("pause");return 0;cout<<r.get()<<endl; //這里不是指針 用的是"."cout<<"a 的地址"<<&r<<endl; //這里是&rsystem ("pause");return 0;
查看完整描述

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本身。


查看完整回答
反對 回復(fù) 2022-11-08
?
寶慕林4294392

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


查看完整回答
反對 回復(fù) 2022-11-08
  • 2 回答
  • 0 關(guān)注
  • 344 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號