簡體   English   中英

字符串和字符串數組的零初始化(C++)

[英]Zero initialization of string and string array (C++)

根據https://en.cppreference.com/w/cpp/language/zero_initialization

在此處輸入圖片說明

在文檔提供的示例中:

std::string s; // is first zero-initialized to indeterminate value
               // then default-initialized to ""

為什么string s;會發生零初始化string s; 如果語法是針對static T object; ?

為什么零初始化發生在默認初始化之前,為什么兩者都允許發生?

零初始化的效果是:

  • 如果 T 是標量類型,則對象的初始值是顯式轉換為 T 的整數常量零。
  • 如果 T 是非聯合類類型,則所有基類和非靜態數據成員都初始化為零,並且所有填充都初始化為零位。 構造函數(如果有)將被忽略。
  • 如果 T 是聯合類型,則第一個非靜態命名數據成員被零初始化,所有填充都被初始化為零位。
  • 如果 T 是數組類型,則每個元素都初始化為零
  • 如果 T 是引用類型,則什么都不做。

如果我初始化string array[2] = {"Test1"}; ? 我知道數組將包含“Test1”和空字符串“”。

但是根據上面的文檔,

如果 T 是數組類型,則每個元素都初始化為零

數據類型是字符串,它是對象/引用類型嗎?

如果 T 是引用類型,則什么都不做。

什么都沒做? 我想也許會調用一個構造函數。 空字符串肯定是什么嗎?

為什么string s;會發生零初始化string s; 如果語法是針對static T object; ?

為什么零初始化發生在默認初始化之前,為什么兩者都允許發生?

在您鏈接到的頁面中,它定義了一個非局部變量。

非局部變量分兩個階段初始化。

  1. 靜態初始化。
  2. 動態初始化(如果適用)。

靜態初始化階段,使用常量初始化零初始化初始化變量

使用動態初始化(如果適用),例如用於具有適當構造函數的對象或使用可在運行時評估的表達式初始化的對象。

您可以在https://en.cppreference.com上閱讀有關該主題的更多信息。

什么都沒做? 我想也許會調用一個構造函數。 空字符串肯定是什么嗎?

引用不能被零初始化。 它只能使用將作為引用的對象進行初始化。

(除非另有說明,否則假定此答案中的所有聲明都在命名空間范圍內。)

為什么string s;會發生零初始化string s; 如果語法是針對static T object; ?
為什么零初始化發生在默認初始化之前,為什么兩者都允許發生?

具有靜態存儲持續時間的變量首先在編譯時初始化為零,然后在運行時可選地動態初始化。 static T object; 聲明一個靜態存儲持續時間的對象。 對於一個簡單的聲明,如

int x;

不執行動態初始化。 對於更復雜的聲明,如

std::string s;

對字符串進行零初始化可能會導致無效的字符串具有破壞的類不變量。 因此,動態初始化調用默認構造函數來確保對象有效。

如果我初始化string array[2] = {"Test1"}; ? 我知道數組將包含“Test1”和空字符串“”。

首先,在編譯時,這兩個對象被零初始化,導致可能的無效狀態。 然后,在運行時,調用構造函數(第一個對象的const char*構造函數和第二個對象的默認構造函數),並構造有效的對象。

數據類型是string ,它是對象/引用類型嗎?

std::string是對象類型而不是引用類型。

【供參考型】什么都沒做? 我想也許會調用一個構造函數。 空字符串肯定是什么嗎?

引用類型不被視為實際的“對象”,因此指定其零初始化語義沒有意義。

暫無
暫無

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

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