函數取地址與複製構造函數的使用

今天在CSDN的論壇上逛一了圈發現有如下兩段代碼:我在兩個提問的地方都已經給予了作答,同時發佈到blog上希望能有更多的人受益。

第一段是對複製構造函數的使用

class c
{
string name;
public:
c(const string& s):name(s){}
};
void fn(c& s)
{
cout<<"ok!"<<endl;
}
int main()
{
fn(string("Jenny"));
}
//這段代碼在VS2005下是肯定不能編譯的,因爲vs只能從string推導出c,沒有辦法自動從string推導出c&。將函數fn()的引用去掉就可以得。------解答:首先在主函數裏的string會生成一個無名的對象,然後調用c的複製構造函數生成一個無名的c對象這就可以,第二層原因是引用必須是有名的對象且必須初始化才能在C++中做引用操作。

第二段是對函數取地地址操作

# include <iostream>

using namespace std;

int func()
{
int a = 2;

return a;
}

int main(void)
{
cout << &func() << endl; //提示這句錯誤,需要左值,如果返回一個對象卻可以

return 0;
}

# include <iostream>

using namespace std;

class human
{
public:
void set(int i){x = i;}
int get(){return x;}
private:
int x;
};

human func()
{
human a;
a.set(123);
cout << a.get()<<endl;
return a;
}

int main(void)
{
cout << &func() << endl; //可以取地址

return 0;
}
<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245); ">//解答:一般的,如果返回值是內建類型的話,例如int,short,char之類的,通常將返回值保存在eax,ax,al寄存器裏面,自然就無法取得地址了。</span>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章