<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國際加速解決方案。 廣告
                [TOC] # 概述 const單詞字面意思為常數,不變的。它是c/c++中的一個關鍵字,是一個限定符,它用來限定一個變量不允許改變,它將一個對象轉換成一個常量 ~~~ const int a = 10; A = 100; //編譯錯誤,const是一個常量,不可修改 ~~~ c語言中,const修飾的變量,是偽常量,編譯器是會分配內存的 c++中,const不會分配內存,`const int m_B = 20;` ![](https://img.kancloud.cn/b5/66/b56665249d3dee580dd0bdfda7535bc4_1132x367.png) # 可見范圍 C和C++中全局 const 變量的作用域相同,都是當前文件,不同的是它們的可見范圍:C語言中 const 全局變量的可見范圍是整個程序,在其他文件中使用 extern 聲明后就可以使用;而C++中 const 全局變量的可見范圍僅限于當前文件,在其他文件中不可見,所以它可以定義在頭文件中,多次引入后也不會出錯。 如果你使用的是 GCC,那么可以通過添加 extern 關鍵字來增大 C++ 全局 const 變量的可見范圍,如下所示: ~~~ extern const int n = 10; ~~~ 這樣 n 的可見范圍就變成了整個程序,在其他文件中使用 extern 聲明后就可以使用了。不過這種方式只適用于 GCC,不適用于 VS/VC。 # c中的const 常量的引進是在c++早期版本中,當時標準C規范正在制定。那時,盡管C委員會決定在C中引入const,但是,他們c中的const理解為”一個不能改變的普通變量”,也就是認為const應該是一個只讀變量,既然是變量那么就會給const分配內存,并且在c中const是一個全局只讀變量,c語言中const修飾的只讀變量是外部連接的 c語言中局部const存儲在堆棧區,只是不能通過變量直接修改const只讀變量的值,但是可以跳過編譯器的檢查,通過指針間接修改const值 如果這么寫: ~~~ const int arrSize = 10; int arr[arrSize]; ~~~ 看似是一件合理的編碼,但是這將得出一個錯誤。 因為arrSize占用某塊內存,所以C編譯器不知道它在編譯時的值是多少? ## C++中的const 在c++中,一個const不必創建內存空間,而在c中,一個const總是需要一塊內存空間。在c++中,是否為const常量分配內存空間依賴于如何使用。一般說來,如果一個const僅僅用來把一個名字用一個值代替(就像使用#define一樣),那么該存儲局空間就不必創建。 如果存儲空間沒有分配內存的話,在進行完數據類型檢查后,為了代碼更加有效,值也許會折疊到代碼中。 不過,取一個const地址, 或者把它定義為extern,則會為該const創建內存空間。 在c++中,出現在所有函數之外的const作用于整個文件(也就是說它在該文件外不可見),默認為內部連接,c++中其他的標識符一般默認為外部連接 c++可以這樣 ~~~ int main() { const int a = 10; int arr[a]; getchar(); return 0; } ~~~ ## cpp中const分配內存的情況 只要是分配內存的,都可以通過指針修改他 ~~~ //1、const分配內存 取地址會分配臨時內存 //2、extern 編譯器也會給const變量分配內存 void test01() { const int m_A = 10; int * p = (int*)&m_A; //會分配臨時內存 } //3、 用普通變量初始化 const 的變量 void test02() { int a = 10; const int b = a; //會分配內存 int * p = (int *) &b; *p = 1000; cout << "b = " << b << endl; } //4、 自定義數據類型 加const也會分配內存 struct Person { string m_Name; //姓名 int m_Age; }; void test03() { const Person p1; //p1.m_Name = "aaa"; Person * p = (Person*)&p1; p->m_Name = "德瑪西亞"; (*p).m_Age = 18; cout << "姓名: " << p1.m_Name << " 年齡: " << p1.m_Age << endl; } ~~~ ## 總結 * c語言全局const會被存儲到只讀數據段。c++中全局const當聲明extern或者對變量取地址時,編譯器會分配存儲地址,變量存儲在只讀數據段。兩個都受到了只讀數據段的保護,不可修改 * c語言中局部const存儲在堆棧區,只是不能通過變量直接修改const只讀變量的值,但是可以跳過編譯器的檢查,通過指針間接修改const值 c++中對于局部的const變量要區別對待: 1. 對于基礎數據類型,也就是const int a = 10這種,編譯器會把它放到符號表中,不分配內存,當對其取地址時,會分配內存 2. 對于基礎數據類型,如果用一個變量初始化const變量,如果const int a = b,那么也是會給a分配內存 3. 對于自定數據類型,比如類對象,那么也會分配內存 * c中const默認為外部連接,c++中const默認為內部連接.當c語言兩個文件中都有const int a的時候,編譯器會報重定義的錯誤。而在c++中,則不會,因為c++中的const默認是內部連接的。如果想讓c++中的const具有外部連接,必須顯示聲明為: `extern const int a = 10;`
                  <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>

                              哎呀哎呀视频在线观看