2010-06-16 29 views
14
int value = 5; // this type of assignment is called an explicit assignment 
int value(5); // this type of assignment is called an implicit assignment 

這些(如果有的話)和顯式和隱式賦值在哪些情況下有什麼不同?C++中的顯式和隱式賦值有什麼區別


http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx

編輯:我其實只是發現這篇文章,這讓整個事情更加清晰......它帶來了另一個問題,你應該標記構造(一般)服用一個原始類型的單個參數 - 數字/布爾型/字符串 - 顯式地保留原樣(當然要留意像構造函數那樣的陷阱,比如(int, SomeType = SomeType())

+3

這聞起來像功課。如果是這樣,請標記爲。 – greyfade 2010-06-16 23:22:32

+0

不是作業,只是我很久以前從沒有調查過的筆記。無論如何,標記作爲家庭作業的東西是做什麼的? – 2010-06-16 23:31:35

+1

這說明問題是作業。 =]通常,回答問題的人會更喜歡提供提示以提供完整的答案。 – strager 2010-06-16 23:36:10

回答

6

它們不同,如​​果一個類有一個構造符標記爲'明確「,然後,其中一個就是 不行。

否則,沒有區別。

-1

只有第一個是一個任務。他們都是初始化。

編輯:其實,我錯了。都不是任務。

+2

這些都不是一個分配。賦值和初始化是互斥的。 – fredoverflow 2010-06-16 23:27:15

+0

heh ...就像我在編輯:P – 2010-06-16 23:29:28

21

這些都不是任何類型的任務 - 它們都是初始化。第一個使用複製初始化,第二個使用直接初始化。 (FWIW,我很確定我以前從未聽過「顯式賦值」或「隱式賦值」這些術語)。

編輯:(大多是爲了應對彌敦道的評論):

下面是從您的評論的代碼修正版本:

#include <iostream> 

struct Foo { 
    Foo() { 
     std::cout << "Foo::ctor()" << std::endl; 
    } 
    Foo(Foo const& copy) { 
     std::cout << "Foo::cctor()" << std::endl; 
    } 
    Foo& operator=(Foo const& copy) { 
     std::cout << "foo::assign()" << std::endl; 
     return *this; 
    } 
}; 

int main(int, const char**) { 
    Foo f; 
    Foo b(f); 
    Foo x = b; 
    return 0; 
} 

運行這個結果應該是:

Foo::ctor() 
Foo::cctor() 
Foo::cctor() 

如果你運行它並得到一個foo::assign(),扔掉你的編譯器並得到一個工程(哦,讓我們知道它是什麼編譯器是如此嚴重破碎)!

+0

不一定*真。對於POD類型,是的,你的陳述是準確的。如果有問題的類型是用戶定義的,那麼很可能有一個用戶定義的賦值運算符在沒有類似的拷貝構造函數的情況下進行轉換。奇怪,是的。但是,可能的。 – 2010-06-16 23:41:03

+0

另外,第一個是分配。只有第二個是初始化。第一個可以並且幾乎肯定會被內聯到等效的拷貝初始化並不會減少它作爲一個賦值。複製初始化和複製分配相同的假設是有缺陷的,並不能保證。 – 2010-06-16 23:43:19

+5

@Nathan:這個答案是正確的。 §8.5/ 12將「複製初始化」定義爲形式爲'T x = a;'和'直接初始化'的任何初始化爲'T x(a);'形式的任何初始化。兩者都是初始化。 – GManNickG 2010-06-16 23:53:13

相關問題