<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 顯式轉換操作符 C++98標準提供隱式和顯式兩種構造函數,也就是說,聲明為顯式形式的構造函數所定義的轉換只能用于顯式轉換,而其他形式的構造函數則用于隱式轉換。例如: ``` struct S { S(int); }; // “普通構造函數”默認是隱式轉換 S s1(1); // ok, 直接構造 S s2 = 1; // ok, 隱式拷貝構造 void f(S); // 能通過編譯(但是經常會產生意外結果——如果S是vector類型會怎么樣呢?) // 譯注:詳見下一用例的解釋 f(1); struct E { explicit E(int); }; // 顯式構造函數 E e1(1); // ok E e2 = 1; // 錯誤(但是常常會讓人感到意外——這怎么會錯呢?) void f(E); // 該處會產生編譯錯誤(而非編譯通過),以避免因隱式類型轉換而得到莫名其妙的結果。 // 例如std::vector::vector(int size), 該構造函數在標準庫中定義為顯式類型轉換, // (譯注:以避免程序員為了初始化一個只含有一個元素10的數組而寫出如下代碼: // vector<int> vec = 10; // 而實際上該代碼的含義卻是定義一個初始包含10個元素的數組) f(1); ``` 然而,禁止從構造函數作隱式轉換(以避免問題),并沒有堵住全部漏洞。如果某個類本身禁止改動,那么可以從另一個不同的類中定義一個轉換操作符。例如: ``` struct S { S(int) { } /* … */ }; struct SS {> int m; SS(int x) :m(x) { } // 在struct S無須定義S(SS)——所謂的“非侵入”式做法 operator S() { return S(m); } }; SS ss(1); // ok; 默認構造函數 S s1 = ss; // ok; 隱式轉換為S后調用拷貝構造函數 S s2(ss); // ok; 隱式轉換為S后調用直接構造函數 void f(S); f(ss); // ok; 隱式轉換為S后傳參 ``` (譯注:這段代碼的意義,實際是通過SS作為中間橋梁,將int轉換為S。) 遺憾的是,C++98中無法定義”顯式轉換操作符”來完全禁止某個類相關的隱式轉換(因為除此之外鮮有用武之地)。C++11則高瞻遠矚,添加了這個特性。例如: ``` struct S { S(int) { } }; struct SS { int m; SS(int x) :m(x) { } // 因為結構體S中沒有定義構造函數S(SS) // 無法將SS轉換為S,所以只好在SS中定義一個返回S的轉換操作符, // 將自己轉換為S。 // 轉換動作,可以由目標類型S提供,也可以由源類型SS提供。) explicit operator S() { return S(m); } }; SS ss(1); // ok; 默認構造函數 S s1 = ss; // 錯誤; 拷貝構造函數不能使用顯式轉換 S s2(ss); // ok; 直接構造函數可以使用顯式轉換 void f(S); f(ss); // 錯誤; 從SS向S的轉換必須是顯式的. // 譯注: 強制類型轉換也可使用顯式轉換,例如 // S s3 = static_cast<S>(ss); ``` 參考: * Standard: 12.3 Conversions * [N2333=07-0193] Lois Goldthwaite, Michael Wong, and Jens Maurer: [Explicit Conversion Operator (Revision 1)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2333.html).
                  <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>

                              哎呀哎呀视频在线观看