2012-12-04 37 views
8

可能性の重複:
What’s the motivation behind having copy and direct initialization behave differently?コピー初期化はなぜですか?なぜコピーコンストラクタが必要ですか?

、コピーの初期化によって、私はそうのような意味:

struct MyStruct 
{ 
    MyStruct(int) {} 
    MyStruct(const MyStruct&) {} 
}; 

MyStruct s = 5; // needs *both* the int and copy constructor 

C++でのプログラミングにもかかわらず年間は、私は上記のコードを決して実現コピーコンストラクタが必要です(jogojapanのおかげで)。一時的なものはいつも除外されていたので、それが私に指摘されるまで、それが存在することさえ知らなかった(少なくとも表面的なレベルでは、最適化されているにもかかわらず)。

グーグルグーグルのかなりの量の後、私はそれがどのように動作するかの考えを得る。私の質問はなぜなのですか?

標準では、上記の例ではコピーコンストラクタが必要ないようにしていませんでしたか?このタイプの初期化でコピーコンストラクタを必要とすることが重要であることを示す特定のケース/例がありますか? のまともな説明もなしに

はなぜ事が、私はちょうど迷惑アーティファクトとしてこれを参照してください、彼らは道彼らはしているが、私は欠けていることが重要な何かがあるのならば、私はむしろ、無知ではないと思います。

+0

コピーコンストラクタの必要性があると思われます名前を挙げて実際には[呼び出されていません](http://ideone.com/35fjAD)です。 – iammilind

+0

@ iammilind:**コピーElision **のために呼び出す必要はありませんが、コピーコンストラクタはアクセス可能でなければなりません。基本的には、標準*でコピーコンストラクタを呼び出すことができます**利用可能である。オプティマイゼーションは標準的なものであることを保証するものではありません。 –

+1

@JesseGood:ありがとう。これはかなり重複しているように見えます。私の考えは、他の質問に対する良い答えではありません。 – Cornstalks

答えて

0

オブジェクトのコピー初期化は、初期化を指示するのが曖昧であり、両方を同じエクステントに使用して、値を互いに等しく設定することができます。

int a = 4; 
int a = int(4); 
int a(4); 

これらの呼び出しのすべてがあいまいである、彼らはすべての整数の場合、コピーコンストラクタ理由が便利である4に等しいを設定し、この

int a(foo(b,r)); //a little messy for a variable declaration 
int a = foo(b,r) //ok, cleaner 

なし++のデータ型cを想像しますあなたもここで、暗黙的および明示的なコピーコンストラクタを使用することが場合があります虚数を処理するために明示的にコピーコンストラクタを使用するサンプルプログラムは次のとおりです。

#include <iostream> 
using std::cout; 
using std::endl; 
class complexNumbers { 
    double real, img; 
public: 
    complexNumbers() : real(0), img(0) { } 
    complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; } 
    explicit complexNumbers(double r, double i = 0.0) { real = r; img = i; } 
    friend void display(complexNumbers cx); 
}; 
void display(complexNumbers cx){ 
    cout<<&quot;Real Part: &quot;<<cx.real<<&quot; Imag Part: &quot;<<cx.img<<endl; 
} 
int main() { 
    complexNumbers one(1); 
    display(one); 
    complexNumbers two =2; 
    display(200); 
    return 0; 
} 
関連する問題