我想弄清楚下面的語句在C++中是如何工作的:std :: string如何賦值操作符?
std::string a = "simple_text";
就是「一」對象先用空的文本,然後在「simple_text」初始化分配給它或者是「一」對象用「simple_text」直接初始化?
我將不勝感激。
我想弄清楚下面的語句在C++中是如何工作的:std :: string如何賦值操作符?
std::string a = "simple_text";
就是「一」對象先用空的文本,然後在「simple_text」初始化分配給它或者是「一」對象用「simple_text」直接初始化?
我將不勝感激。
如果構造方法中沒有使用關鍵字explicit
定義,那麼編譯器能適應
std::string a = "simple_text";
到
std::string a = std::string("simple_text");
在這種情況下,它是不是=
操作而是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
本聲明
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");
有這個代碼不分配。這是初始化,它調用'std :: string :: string(const char *)'(等等),i。即一個構造函數,而不是'std :: string :: operator ='。它如何實施是無關緊要的。 – 2014-02-08 10:39:32
http://coliru.stacked-crooked.com/a/a13f1d093e8440e7 – Rapptz