2017-08-30 194 views
-1

我正在學習C++,並在學習構造函數的使用時遇到此問題。考慮下面的代碼片段:構造函數與賦值運算符

#include <string> 
#include <iostream> 

using namespace std; 

class Foo 
{ 
public: 
    Foo() { m_ = 0; cout << "default ctor called." << endl; } 
    Foo(int a) { m_ = 1; cout << "int ctor called." << endl; } 
    Foo(string str) { m_ = 2; cout << "str ctor called." << endl; } 
    Foo(Foo& f) 
    { 
     cout << "copy ctor called." << endl; 
     m_ = f.m_; 
    } 

    Foo& operator=(string str) 
    { 
     cout << "= operator called." << endl; 
     m_ = 3; 
     return *this; 
    } 

    int m_; 
}; 


int main() 
{ 
    Foo f1 = 100; 
    cout << f1.m_ << endl; 

    Foo f2 = "ya"; 
    cout << f2.m_ << endl; 

    Foo f3("ha"); 
    cout << f3.m_ << endl; 

    f1 = "hee"; 
    cout << f1.m_ << endl; 

    Foo f4 = Foo(); 
    cout << f4.m_ << endl; 

    return 0; 
} 

我意識到

Foo f1 = 100; 

Foo f2 = "ya"; 

實際調用構造函數,就好像我做

Foo f1(100); 

Foo f2("ya"); 

我無法找到任何這相關的解釋。任何人都可以解釋一下這裏發生了什麼? 以下線程接近我的,但並不完全回答我的問題。 C++ Object Instantiation vs Assignment

+1

你的C++教科書對這個主題有什麼要說的? –

+0

初始化與賦值不同。 – user0042

回答

2

Foo對象從分配給對象值構造(implicit conversation

隱式轉換被執行時,不接受該類型的一些類型 T1在上下文中所用的表達,但接受一些 其他類型T2

在這裏使用它的地方。然後copy-initializtion初始化來自另一對象的對象(如前面提到的通過隱式交談構造)

可以禁用它(僅針對此構造)通過使用explicit關鍵字。

explicit Foo(int a) 

這使得這種操作

Foo f1 = 100; 

非法的。

+0

這並不禁用複製初始化。它禁止從「int」到「Foo」的轉換。 –

+0

它不直接禁用複製初始化。這只是顯式構造函數不考慮用於複製初始化。 – Rakete1111

+0

禁用複製初始化不會允許'Foo f; Foo g = f;',你的代碼沒有。 –

相關問題