簡體   English   中英

以下聲明之間有什么區別?

[英]What is the difference between the following declarations?

string str("Hello World");
string str="Hello World";

我似乎不明白兩者之間的區別。 根據我的教科書,第一個語句執行的操作是“使用C字符串初始化構造函數”。 那么,第一條語句是否定義了C字符串,第二條語句定義了C ++字符串? 還請解釋一下C字符串和C ++字符串之間的區別。

這兩行都創建了一個名為str的C ++ std::string 並且都從C字符串初始化它們。 不同之處在於它們的初始化方式:

首先是直接初始化

string str("Hello World");

這將調用string(const char *)構造函數。

第二個是復制初始化

string str = "Hello World";

這需要string(const char *)構造函數是非explicit (對於先前的方法,該構造函數可以是explicit )。 根據標准的版本,我們會有一些不同的行為:

  • 在C ++ 17之前的版本中:首先,創建一個臨時對象(使用string(const char *) ),然后調用copy(或move)構造函數初始化str 因此,復制(或移動)構造函數需要可用。 可以省略復制構造函數階段(因此,就像直接初始化情況一樣創建對象),但是仍然需要復制(或移動)構造函數。 如果不可用,則代碼將無法編譯。
  • 發布C ++ 17:在這里,因為該標准保證復制省略 ,所以僅調用string(const char *)構造函數。 復制(或移動)構造函數不需要可用。 如果復制構造函數不可用,則代碼仍會編譯。

因此,對於這種特殊情況,兩個初始化之間的末尾沒有真正的區別,因此,兩個str字符串將變為相同。

兩條線限定類型的變量std::string命名str由的構造構成std::string采用一個char const*作為其參數。 這些行沒有區別。

[...] C字符串[...] C ++字符串[...]?

通常稱為C字符串的不過是char的零終止數組:

"foobar"; // an array of 7 const chars. 7 instead of 6 because it is 0-terminated.
char foo[] = "foobar";  // an array of 7 chars initialized by the string given

但是std::string是C ++標准庫的一個類,用於管理動態長度的字符串資源。

“ Hello World”是C字符串(以零結尾的字符序列)。 在這兩種情況下, string (或std::string的全名是)都是c ++字符串(不以null終止)。

這兩行調用相同的構造函數,該構造函數采用c字符串並構造一個std::string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM