2017-01-05 1 views
0
//V4.cpp 
#include <iostream> 
using namespace std; 
class V3 { 
private: 
    double x, y, z; 
public: 
    V3(double a, double b, double c): x(a), y(b), z(c) { 
     cout << "V3(double, double, double)" << endl; 
    } 
    V3(const V3 &a): x(a.x), y(a.y), z(a.z) { 
     cout << "V3(const V3 &)" << endl; 
    } 
}; 
class V4 { 
private: 
    V3 xyz; 
    double time; 
public: 
    V4(V3 a, double t): xyz(a), time(t) { 
     cout << "V4(V3, double)" << endl; 
    } 
}; 
int main(void) 
{ 
    V3 xyz(1.0, 2.0, 3.0); 
    double t(4.0); 
    V4 xyzt(xyz, t); 

    return 0; 
} 

クラスV4には別のクラスV3があり、V3のオブジェクトはV3の存在オブジェクトによって初期化されるため、V4のコンストラクタはV3のコピーコンストラクタを呼び出します。コピーコンストラクタは一度呼び出されますが、結果はそれがtiwceと呼ばれていることを示しています、それはなぜですか?なぜオブジェクトがC++の別のオブジェクトに含まれているときにコピーコンストラクタが2回呼び出されるのですか?

コードのコンパイル:

g++ V4.cpp -o V4 -Wall 

をして実行します。

./V4 

と結果:

V3(double, double, double) 
V3(const V3 &) 
V3(const V3 &) 
V4(V3, double) 

をので、その結果を見て、なぜV3のコピーコンストラクタが2回呼び出され? 私のOSはLubuntu16.04で、g ++は5.4.0です

答えて

4

のコンストラクタではV3 aを値で受け取り、不要な追加コピーが発生しています。あなたはconst&でそれを取る必要があります。

class V4 { 
private: 
    V3 xyz; 
    double time; 
public: 
    V4(const V3& a, double t): xyz(a), time(t) { 
//  ^^^^^^^^^^^ 
     cout << "V4(V3, double)" << endl; 
    } 
}; 

wandbox example

+0

私はちょうどあなたのコードを試してきた、とコピーコンストラクタが一度呼ばれた、ありがとうございました! – fagdih

+0

@fagdih:ようこそ。自分の問題を解決した場合は、投票ボタンの横にある緑色のチェックマークをクリックして、「受け入れ済みの回答をマークする」ことを忘れないでください。 –

+0

:私は初心者です、答えを受け入れる方法は? – fagdih

関連する問題