亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 請教一個C++拷貝構(gòu)造函數(shù)問題 [打印本頁]

作者: qylhnu    時間: 2008-10-15 23:05
標(biāo)題: 請教一個C++拷貝構(gòu)造函數(shù)問題
#include <iostream>
using namespace std;

class Test
{
public:
    Test(){
        cout << "constructor"<<endl;
    }
//    Test(Test & hu){
//        cout << "copy constructor" << endl;
//    }

    ~Test(){}
};

Test fun(Test x)
{
    return x;
}
int main(void)
{
    Test h1;
    Test h2 = fun(h1);
    return 0;
}
  在上面的代碼中,若將注釋去掉,即自己寫拷貝構(gòu)造函數(shù),則編譯通不過,想了很長時間都沒想明白,為什么?

[ 本帖最后由 qylhnu 于 2008-10-15 23:08 編輯 ]
作者: tyc611    時間: 2008-10-15 23:22
因?yàn)閒un函數(shù)返回是一個臨時Test對象,對它的引用只能是const引用,而你的拷貝構(gòu)造函數(shù)是非const引用(Test h2 = fun(h1);),所以不能通過編譯
把你的拷貝構(gòu)造函數(shù)改為const引用就行了,另外一般拷貝構(gòu)造函數(shù)都寫成const引用
作者: qylhnu    時間: 2008-10-15 23:34
非常感謝!大概明白了。

再麻煩下,我試著同時加了有const和無const的兩個版本,然后發(fā)現(xiàn)系統(tǒng)直接調(diào)用的是無const的那個版本,這是為什么呢?
作者: tyc611    時間: 2008-10-15 23:44
原帖由 qylhnu 于 2008-10-15 23:34 發(fā)表
非常感謝!大概明白了。

再麻煩下,我試著同時加了有const和無const的兩個版本,然后發(fā)現(xiàn)系統(tǒng)直接調(diào)用的是無const的那個版本,這是為什么呢?

不可能吧?
你再好好確信下,或者把代碼和結(jié)果貼出來
作者: qylhnu    時間: 2008-10-15 23:49
#include <iostream>
using namespace std;

class Test
{
public:
    Test(){
        cout << "constructor"<<endl;
    }
    Test(const Test & hu){
        cout<<": const copy constructor" << endl;
    }
    Test(Test & hu){
        cout <<": copy constructor" << endl;
    }
    ~Test(){}

};

Test fun(Test x)
{
    return x;
}
int main(void)
{
    Test h1;
    Test h2 = fun(h1);
   
    return 0;
}
結(jié)果:
constructor
: copy constructor
: copy constructor
作者: tyc611    時間: 2008-10-16 00:09
這個我也不能很好解釋,這里給出一種可能的解釋:
h1->x:調(diào)用一次拷貝函數(shù),函數(shù)重載時解析為非const版本
func(h1)->h2:這里本來有一個中間的臨時對象,但從結(jié)果來看被編譯器優(yōu)化了(NRV,命名返回值優(yōu)化),所以還是調(diào)用非const

我想產(chǎn)生這種似乎矛盾的結(jié)果,原因是編譯器的分階段處理造成的
當(dāng)然,從實(shí)踐角度來看,不應(yīng)該寫兩個版本的,const版本已經(jīng)完全夠用(我還沒發(fā)現(xiàn)需要非const版本的情景)
作者: qylhnu    時間: 2008-10-16 09:48
再次感謝!還學(xué)習(xí)了“命名返回值優(yōu)化”,好像優(yōu)化后直接用x做參數(shù)了。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2