C++ Primer 查漏補缺 —— C++ 中的各種初始化


初學者在剛開始讀 C++ Primer 的時候,總是容易被書中各種初始化搞得頭大:默認初始化、列表初始化、值初始化、類內初始值、構造函數初始值列表、new intnew int() 的區別...

本文把書中這些概念集中總結如下,大括號【】內為原書中文版第 5 版的相應頁碼。

  • 列表初始化(list initialization)【P39】:用花括號 {} 來初始化變量,在 C++11 中得到全面應用

    • // 以下 4 種初始化的形式都可以
      int i = 0;
      int i = {0};
      int i{0};
      int i(0);
      
      long double ld = 3.1415;
      int a{ld}; // 報錯,轉換存在信息丟失的風險
      int b = {ld}; // 報錯,轉換存在信息丟失的風險
      int c(ld); // 正確,但信息丟失
      int d = ld; // 正確,但信息丟失
      
    • 如果列表初始化存在信息丟失的風險, 編譯器將報錯。

  • 默認初始化【P40】:如果定義變量時沒有指定初始值,則變量被默認初始化

    • 默認情況下,數組元素被默認初始化【P101】
    • 類類型:由類負責初始化
    • 內置類型
      • 定義在任何函數體之外(可以在命名空間中):初始化為 0
      • 定義在函數體內部(包括定義在類內的類成員【P236】)的非靜態變量:未初始化!
      • 局部靜態變量【P185】:如果沒有顯式的初始值,將執行值初始化,內置類型將初始化為 0
  • 值初始化(value initialization)【P88、P118】

    • 何時進行值初始化?
      • 只提供容器(數組除外?)的元素數量而不指定初值時,就會執行值初始化
      • 內置類型局部靜態變量 【P185】
      • new 類型,后面帶圓括號,如:new int()new string() 【P408】
    • 內置類型:初始值設為 0
    • 類類型:由類的默認構造函數初始化
  • 類的對象無論在函數內/外,全局/局部,靜態/非靜態,其初始化都是由類負責

    • 類內初始值【P65】
    • 構造函數初始值列表【P238】
  • 類內初始值(in-class initializer)【P65】

    • C++11 新標准,在類的定義中直接指定初值,可以用等號或者花括號,但是不能用圓括號。

    • class SalesData {
          std::string bookNo;
          unsigned unitsSold = 0;
          double revenue {0.0};
      };
      
    • 【P238】推薦使用類內初始值!

  • 構造函數初始值列表【P238】:用構造函數的參數初始化成員變量。

    • class SalesData {
      public:
          SalesData(const std::string &s) : bookNo(s) {}
          SalesData(const std::string &s, unsigned n, double p) : bookNo(s), unitsSold(n), revenue(p*n) {}
      };
      
  • new【P408】

    • string *ps1 = new string;    // 默認初始化為空 string
      string *ps2 = new string();  // 值初始化為空 string
      int *pi1 = new int;          // 默認初始化,*pi1 值未定義!
      int *pi2 = new int();        // 值初始化,*pi2 為 0
      
      const int *pci - new const int(1024); // 分配並初始化一個 const int
      

原文地址:https://www.cnblogs.com/tengzijian/p/15376463.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM