<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 類成員的內部初始化 在C++98標準里,只有static const聲明的整型成員能在類內部初始化,并且初始化值必須是常量表達式。這些限制確保了初始化操作可以在編譯時期進行。例如: ``` int var = 7; class X { static const int m1 = 7; // 正確 const int m2 = 7; // 錯誤:無static static int m3 = 7; // 錯誤:無const static const int m4 = var; // 錯誤:初始化值不是常量表達式 static const string m5 = “odd”; //錯誤:非整型 // … }; ``` C++11的基本思想是,允許非靜態(non-static)數據成員在其聲明處(在其所屬類內部)進行初始化。這樣,在運行時,需要初始值時構造函數可以使用這個初始值。考慮下面的代碼: ``` class A { public: int a = 7; }; ``` 這等同于: ``` class A { public: int a; A() : a(7) {} }; ``` 單純從代碼來看,這樣只是省去了一些文字輸入,其實它的真正永無之地在于擁有多個構造函數的類。因為大多情況下,對于同一個成員,多個構造函數應使用相同的值去初始化。例如: ``` class A { public: A(): a(7), b(5), hash_algorithm(“MD5″), s(“Constructor run”) {} A(int a_val) : a(a_val), b(5), hash_algorithm(“MD5″), s(“Constructor run”) {} A(D d) : a(7), b(g(d)), hash_algorithm(“MD5″), s(“Constructor run”) {} int a, b; private: // 哈希加密函數可應用于類A的所有實例 HashingFunction hash_algorithm; std::string s; // 用以指明對象正處于生命周期內何種狀態的字符串 }; ``` 對于每一個構造函數,程序員必須使用完全一樣的字面值來來初始化hash_algorithm和s這兩個成員。但是并不是所有人都記得嚴格遵守這條規則,一旦出現紕漏,程序將難以維護。C++11給出了解決之道:可在成員聲明的地方直接賦以初值: ``` class A { public: A(): a(7), b(5) {} A(int a_val) : a(a_val), b(5) {} A(D d) : a(7), b(g(d)) {} int a, b; private: //哈希加密函數可應用于類A的所有實例 HashingFunction hash_algorithm{“MD5″}; //用以指明對象正處于生命周期內何種狀態的字符串 std::string s{“Constructor run”}; }; ``` 如果一個成員同時在類內部初始化時和構造函數內被初始化,則只有構造函數的初始化有效(這個初始化值“優先于”默認值)(譯注:可以認為,類內部初始化先于構造函數初始化進行,如果是對同一個變量進行初始化,構造函數初始化會覆蓋類內部初始化)。因此,我們可以進一步簡化: ``` class A { public: A() {} A(int a_val) : a(a_val) {} A(D d) : b(g(d)) {} int a = 7; int b = 5; private: //哈希加密函數可應用于類A的所有實例 HashingFunction hash_algorithm{“MD5″}; //用以指明對象正處于生命周期內何種狀態的字符串 std::string s{“Constructor run”}; }; ``` 參考文獻: * the C++ draft section “one or two words all over the place”; see proposal. * [N2628=08-0138] Michael Spertus and Bill Seymour: [Non-static data member initializers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2628.html). (翻譯:lianggang jiang)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看