2016-11-22 14 views
1

まず、C++でプログラミングを始めたばかりのので、まずはnoobの質問についてお詫び申し上げます。列挙型を含む構造体のC++コピーコンストラクタ

DataStruct SomeFile::SomeFunction(Foo foo) 
{ 
    DataStruct dataStruct; 

    double foo2 = 5.8; 
    DataStruct.foo = foo2; 

    double foo3 = 6.0; 
    DataStruct.foo1 = foo3; 

    return DataStruct; 
} 

I:

typedef struct DataStruct 
{ 
    double foo; 
    double foo1; 

    DataStruct::DataStruct() 
     : foo(0.0), foo1(0.0) 
    { 
    } 

} DataStruct; 

は、その後、私は値でそれを移入した後、この構造のオブジェクトを返す別のファイル内の機能を有する:

Iは、ヘッダファイルに定義された構造を有していますこのためにコピーコンストラクタを作成する必要があるかどうかはわかりません。私がしなければならない場合、私はどこでそれを作り出すべきかわからない。

+3

enumはどこですか? – juanchopanza

+2

トピックオフ: 'typedef構造体DataStruct {...} DataStruct;'はCから残されています。C++では 'struct DataStruct {...};'で十分です。 – user4581301

答えて

3

表示した例のカスタムコピーコンストラクタを定義する必要はありません。コンパイラは、構造体の値のメンバごとのコピーを実行する、デフォルトのコピーコンストラクタを提供します。構造体が些細なデータ型や独自のコピーコンストラクタを定義する型しか含まない場合、デフォルトのcopコンストラクタで十分です。

コピーコンストラクタに実際に注意する必要があるときは、外部リソース(ファイルハンドル、動的に割り当てられたメモリなど)を管理する必要がある場合のみです(Rule of Threeを参照)。言われていること

カスタムコピーコンストラクタを定義したい場合、それは次のようになります。

struct DataStruct 
{ 
    double foo; 
    double foo1; 

    DataStruct() 
     : foo(0.0), foo1(0.0) 
    { 
    } 

    DataStruct(const DataStruct &src) 
     : foo(src.foo), foo1(src.foo1) 
    { 
    } 

    DataStruct& operator=(const DataStruct &rhs) 
    { 
     if (&rhs != this) 
     { 
      foo = src.foo; 
      foo1 = src.foo1; 
     } 
     return *this; 
    } 
}; 

言われていること、あなたが示されている例を考えると、コンパイラはReturn Value Optimizationを採用することができるので、SomeFunction()はありません返されたdataStruct変数のコピーを最初に作成する必要はありません(そのFooパラメータは別の問題です)。

+0

ご清聴いただきありがとうございます。 – Jasmine

関連する問題