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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 枚舉類——具有類域和強類型的枚舉 枚舉類(“新的枚舉”/“強類型的枚舉”)主要用來解決傳統的C++枚舉的三個問題: * 傳統C++枚舉會被隱式轉換為int,這在那些不應被轉換為int的情況下可能導致錯誤 * 傳統C++枚舉的每一枚舉值在其作用域范圍內都是可見的,容易導致名稱沖突(同名沖突) * 不可以指定枚舉的底層數據類型,這可能會導致代碼不容易理解、兼容性問題以及不可以進行前向聲明 枚舉類(enum)(“強類型枚舉”)是強類型的,并且具有類域: ``` enum Alert { green, yellow, election, red }; // 傳統枚舉 enum class Color { red, blue }; // 新的具有類域和強類型的枚舉類 // 它的枚舉值在類的外部是不可直接訪問的,需加“類名::” // 不會被隱式轉換成int enum class TrafficLight { red, yellow, green }; Alert a = 7; // 錯誤,傳統枚舉不是強類型的,a沒有數據類型 Color c = 7; // 錯誤,沒有int到Color的隱式轉換 int a2 = red; // 正確,Alert被隱式轉換成int // 在 C++98中是錯誤的,但是在C++11中正確的 int a3 = Alert::red; int a4 = blue; // 錯誤,blue并沒有在類域中 int a5 = Color::blue; // 錯誤,沒有Color到int的默認轉換 Color a6 = Color::blue; // 正確 ``` 正如上面的代碼所展示的那樣,傳統的枚舉可以照常工作,但是你現在可以通過提供一個類名來改善枚舉的使用,使其成為一個強類型的具有類域的枚舉。 因為新的具有類名的枚舉具有傳統的枚舉的功能(命名的枚舉值),同時又具有了類的一些特點(枚舉值作用域處于類域之內且不會被隱式類型轉換成int),所以我們將其稱為枚舉類(enum class)。 因為可以指定枚舉的底層數據類型,所以可以進行簡單的互通操作以及保證枚舉值所占的字節大小: ``` enum class Color : char { red, blue }; // 緊湊型表示(一個字節) // 默認情況下,枚舉值的底層數據類型為int enum class TrafficLight { red, yellow, green }; // E占幾個字節呢?舊規則只能告訴你:取決于編譯器實現 enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; // C11中我們可以指定枚舉值的底層數據類型大小 enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; ``` 同時,由于能夠指定枚舉值的底層數據類型,所以前向聲明得以成為可能: (譯注:就是在枚舉類定義之前就使用這個枚舉類的名字聲明指針或引用變量) ``` enum class Color_code : char; // (前向) 聲明 void foobar(Color_code* p); // 使用 // ... // 定義 enum class Color_code : char { red, yellow, green, blue }; ``` 枚舉類的底層數據類型必須是有符號或無符號的整型,默認情況下是int。 標準庫中也使用了枚舉類。 * 系統特定的錯誤代碼,定義在`<system_error>: enum class errc</system_error>` * 指針安全指示,定義在`<memory>: enum class pointer_safety { relaxed, preferred, strict }</memory>` * I/O流錯誤,定義在`<iosfwd>: enum class io_errc { stream = 1 }</iosfwd>` * 異步通信錯誤,定義在`<future>: enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied }</future>` 其中的某些枚舉類還定義了操作符重載,比如“==”等。 參考: the C++ draft section 7.2 [N1513=03-0096] David E. Miller: Improving Enumeration Types (original enum proposal). [N2347 = J16/07-0207] David E. Miller, Herb Sutter, and Bjarne Stroustrup: Strongly Typed Enums (revision 3). [N2499=08-0009] Alberto Ganesh Barbati: Forward declaration of enumerations.
                  <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>

                              哎呀哎呀视频在线观看