2016-09-23 4 views
3
#include <iostream> 
using namespace std; 
class myclass { 
public: 
    myclass(); 
    myclass(const myclass &o); 
    myclass f(); 
}; 
myclass:: myclass(){ 
    cout<<"Constructing normally"<<endl; 
}; 
myclass:: myclass(const myclass &o){ 
    cout<<"Constructing copy"<<endl; 
}; 
myclass myclass::f(){ 
    myclass temp; 
    return temp; 
}; 
int main(){ 
    myclass obj; 
    obj = obj.f(); 
    return 0; 
} 

私はプログラムの出力がなければならないことを示して本の中で、この例を見つけました:コピーコンストラクタが機能し始めたら?

Constructing normally 
Constructing normally 
Constructing copy 

しかし、私は自分のコンパイラでコンパイルするときにのみ

Constructing normally 
Constructing normally 
の下に書かれた出力を示しています

内部で実際に何が起こっていますか?すなわちcoutコール -

+0

それはあなたのコンパイラが二行目のために離れてコピーを最適化しました 'OBJ = obj.f()を意味する。?' – EdChum

+0

私はそれを得ることができませんでした:(あなたはそれを詳しく説明してくださいすることができ – IAmBlake

+0

読む戻り値について最適化とコピーエリジョン(あなたの本は古いかもしれません)。 –

答えて

11

あなたのコンストラクタは副作用を持っています。したがって、コンパイラobj = obj.f();で取られたコピーを最適化することができません

しかし、C++標準は、それが副作用であることがにもかかわらず、

myclass myclass::f(){ 
    myclass temp; 
    return temp; 
}; 

で撮影したディープコピーを最適化することができません。許容可能な戦略は、という名前の戻り値の最適化と呼ばれます。

悲しいことに、あなたの書籍は、実際には時代遅れで、実際には当初から間違っています!今度の冬に、あの居心地の良い火を照らすために、あなたはそれを火照りに使うことができます。

+0

サニー、あなたは言ったのですか? –

+0

@GillBates:Ha。私はオフィスに戻って来なければならなかった。今私は何かを集めている。 – Bathsheba

+1

あなたは「今私はコーヒーを飲んでいる間にコンピュータが苦労するのを待っている」という意味ですか? –

0
#include <iostream> 
using namespace std; 
class myclass { 
public: 
myclass(); 
myclass(const myclass &o); 
myclass f(); 
}; 
myclass:: myclass(){ 
cout<<"Constructing normally"<<endl; 
}; 
myclass:: myclass(const myclass &o){ 
cout<<"Constructing copy"<<endl; 
}; 
myclass myclass::f(){ 
myclass *temp; 
return *temp; 
}; 
int main(){ 
myclass obj; 
obj = obj.f(); 
return 0; 
} 
+0

これを試すと、出力が得られます:通常の作成とコピーの作成 –

関連する問題