常見的C++中const常量用法分析講解

來源:互聯網
上載者:User
先對C語言中的const和C++中的const進行講解,前者const修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊。後者C++在C的基礎上對const進行了進化處理。

1、C語言中的const:

  • const修飾的變數是唯讀,本質還是變數

  • const修飾的局部變數在棧上分配空間

  • const修飾的全域變數在唯讀儲存區配置空間

  • const只在編譯期有用,在運行期無效

  • const不能定義真正意義上的常量

const修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊。const 局部變數是在棧上分配空間,可以通過指標改變這個空間裡面的值。過了編譯期,const變數的常量特性,唯讀特性就沒有了,唯讀特性只在編譯期有效,運行期根本無效。const修飾的全域變數在唯讀儲存區配置空間,因此如果用指標去修改了const修飾的全域變數,程式就會崩潰,因為修改了程式唯讀儲存區中內容,大部分程式都會發生崩潰。

2、C++中的const

C++在C的基礎上對const進行了進化處理,具體表現在:

  • const聲明時,在符號表中放入常量

  • 編譯過程中發現常量直接以符號表中的值替換(常量摺疊)

  • 編譯過程中也可能為對應的常量分配儲存空間:

    • const用在全域或者使用了static關鍵字說明,存放在唯讀資料區

      extern const int i = 10;static const int i = 10;// 或者修飾全域變數const int a =10;int main(){}
    • 局部變數中對const常量使用了&操作符,在棧區分配空間

注意:C++編譯器雖然可能為 const常量分配空間,但不會使用其儲存空間中的值

符號表是編譯過程中產生的一種資料結構

#include <iostream>#include <string>using namespace std;const int i = 10;          // 如果通過指標去改變i,就會出現段錯誤:嘗試修改唯讀資料區資料int main(){    const int a = 5;    int *p = (int *)&a;    // &a, 給a標識符分配空間了,並用p指向了該空間,                           // 可以通過*p訪問這個地址,但是不能通過a來訪問    *p = 10;               // 不能通過指標去改變a的值    cout << a << endl;    cout << *p << endl;        return 0;}

3、 與宏定義對比

C++ 中的const常量類似於宏定義

const int c = 5;// 類似於#define c 5

但是cosnt與宏定義的區別在於:

  • const常量是有編譯器處理

  • 編譯器對cosnt常量進行類型檢查和範圍檢查

  • 宏定義由前置處理器處理,只是進行單純的文本替換

#include <stdio.h>void f(){    #define a 3    const int b = 4;}void g(){    printf("a = %d\n", a);    // 在g函數中訪問f函數中的宏定義,完全沒有問題    // 在預先處理的時候就進行了宏替換,對編譯器來說,就是printf("a = %d\n", 3);    // 宏是沒有範圍的概念        // const 定義的常量,被編譯器處理,是有範圍的,不能訪問b    printf("b = %d\n", b);}int main(){    const int A = 1;    const int B = 2;    int array[A + B] = {0};        /* C編譯    const修飾得到的只是具有唯讀特性的變數,數組的大小是由兩個變數的大小決定的,    兩個變數相加的結果需要在啟動並執行時候才能直到,因此編譯器編譯的時候不知道這個數組長度,直接報錯    */        /* C++編譯    const是定義的真正意義上的常量,直接從符號表中取值,編譯的時候就知道A和B的值,    可以得到數組的長度,不會報錯    */    int i = 0;        for(i=0; i<(A + B); i++)    {        printf("array[%d] = %d\n", i, array[i]);    }        f();    g();        return 0;}

相關文章:

php中const與define的區別分析

相關視頻:

PHP底層分析視頻教程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.