2014-02-08 97 views
1

我想弄清楚下面的語句在C++中是如何工作的:std :: string如何賦值操作符?

std::string a = "simple_text"; 

就是「一」對象先用空的文本,然後在「simple_text」初始化分配給它或者是「一」對象用「simple_text」直接初始化?

我將不勝感激。

+2

有這個代碼不分配。這是初始化,它調用'std :: string :: string(const char *)'(等等),i。即一個構造函數,而不是'std :: string :: operator ='。它如何實施是無關緊要的。 – 2014-02-08 10:39:32

+1

http://coliru.stacked-crooked.com/a/a13f1d093e8440e7 – Rapptz

回答

4

如果構造方法中沒有使用關鍵字explicit定義,那麼編譯器能適應

std::string a = "simple_text"; 

std::string a = std::string("simple_text"); 
1

在這種情況下,它是不是=操作而是CCTOR。由於a尚未構建,因此必須構建。

您可以體驗到在下面的例子:

class Foo{ 
    int bar; 
public: 
    Foo(int anInt): bar(anInt){ 
     std::cout << "CTOR called\n"; 
    } 
    Foo(Foo& aFoo){ 
     this->bar = aFoo.bar; 
     std::cout << "CCTOR called\n"; 
    } 
    Foo& operator=(Foo& aFoo){ 
     this->bar = aFoo.bar; 
     std::cout << "operator = called\n"; 
     return *this; 
    } 

}; 

int main(){ 
    Foo aFoo(5); 
    Foo bFoo = aFoo; // since bFoo is not instantiated yet, the CCTOR constructs it. 
    return 0; 
} 

輸出將是

CTOR called 
CCTOR called 
1

本聲明

std::string a = "simple_text"; 

不拷貝賦值運算符。它是一個對象的定義,所以使用了一個構造函數。

這種說法是等效於

std::string a = std::string("simple_text"); 

起初的臨時對象被創建的std :: string( 「simple_text」);使用帶參數const char *的構造函數,然後通過使用移動構造函數將該對象移動到一個對象中。

但是,C++標準允許消除移動構造函數的調用。所以定義

std::string a = "simple_text"; 

將相當於簡單地

std::string a("simple_text");