2012-12-04 74 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:無需調用是由於** Copy elision **,但複製構造函數需要可訪問。基本上,這意味着標準*允許*複製構造函數被調用,它必須**能得到的。優化不是標準保證事實上它與標準適應的相反。 –

+1

@JesseGood:謝謝你。看起來這幾乎是重複的。那種令人沮喪的回答在另一個問題上沒有很好的答案... – Cornstalks

回答

0

對象的複製初始化不明確以指導初始化,兩者都可用於相同的範圍,以便將值設置爲彼此相等。

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

所有這些調用的是模糊的,它們都設置一個等於4。其原因在一個整數的情況下,複製構造是方便,假設C++數據類型而不此

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

您也可以使用隱式和顯式拷貝構造函數,下面是一個使用拷貝構造函數明確處理虛數的示例程序:

#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; 
} 
相關問題