2015-11-14 48 views
0

我真的不能想到一個特定的標題,因爲我真的不知道該怎麼說。我對此非常困惑,因爲我之前的問題沒有得到真正的答案,但只會讓我更加困惑。我的另一個question複製構造函數沒有被調用,麻煩理解賦值操作符如何工作

定義VS設置的std :: string中的std :: string設置成0比0

用戶mnciitbhu說,他在GCC 5.2得到一個錯誤。我正在使用Microsoft Visual Studio,所以我在Code :: Blocks上試過,並且沒有錯誤。除此之外,我想爲自己嘗試一下。我有一個類 - Test

class Test { 

public: 

    Test(const Test& T) { 

     std::cout << "COPY CTOR\n"; 

    } 

    Test(){ 

     std::cout << "DEFAULT CTOR\n"; 

    } 

    Test(int NUMBER) { 

     std::cout << "INT CTOR CALLED\n"; 

    } 


}; 

在我的主要功能,當我做

Test t1 = 5; 
t1 = 10; 

輸出

INT CTOR CALLED

INT CTOR CALLED

現在在那裏我得到困惑是當喲你做Test t1 = 5,另一個問題的用戶說它會創建一個臨時的Test,然後調用複製構造函數。這永遠不會調用複製構造函數。另外,關於我的另一個問題;當我做了

// text = std::string 
text = NULL; 

其中一個答案說,它沒有工作,因爲它沒有定義operator=。我Test類也從未定義它,但這樣做

t1 = 10; 

仍然有效,並再次調用構造函數。其他question上的一位用戶表示,在這種情況下,它將調用賦值運算符。這並沒有,正如你從輸出中可以看出的那樣。所以,可能有人請解釋一下,很詳細,爲什麼

std::string text = NULL; 
text = NULL; 

給我一個錯誤,並

Test t1 = 5; 
t1 = 10; 

作品,並不會調用拷貝構造函數,並調用構造函數的兩倍。

實際在做什麼=?爲什麼它調用構造函數,當我做t1 = 10

+0

你的例子的輸出應該包含'INT CTOR CALLED'而不是'DEFAULT CTOR',錯字? – fghj

+0

@ user1034749是的,謝謝你,這是一個錯字 –

+0

那麼,你的問題是什麼?如果你想在你的代碼上編譯時間錯誤,可以在你的'Test'構造函數中添加'explicit',就像這樣'explicit Test(int NUMBER)' – fghj

回答

-3

通常NULL被定義爲((void*)0)std::string沒有如何構建從void *指針字符串,性病:: basic_string的根本就沒有這樣的構造理念。

嘗試

std::string text = (const char*)0; 

代替。

+0

NULL在C++中定義爲整數,而不是指針。你的NULL定義來自C。 – Eugene

+0

'std :: string'可以由'const char *'構造,因此它可以由'NULL'構造。 – juanchopanza

+0

@Eugene'NULL'在技術上是用C和C++定義的。 – Jason

相關問題