1. 程式人生 > 實用技巧 >c++中的const

c++中的const

一、const的介紹

在c++中,const修飾的變數變成了真正的常量,在定義時會放入到符號表中,編譯器在編譯過程中,遇到const修飾的變數時,直接從符號表取出常量的值進行替換。

const變數只有在使用extern宣告為全域性變數或者使用取地址操作&時,才會分配儲存空間。

例項:

#include <iostream>
using namespace std;

int main()
{
    const int a = 0;//定義一個const修飾的區域性變數
    int *p = (int*)&a;//這裡使用了&操作,會分配儲存空間

    //a = 6;
//嘗試直接修改a的值,編譯器報錯,a是常量,不能修改。 *p = 5;//a是常量,在c語言中可以通過這種方式修改它的值,一般不建議做這樣的操作。 cout << "a=" << a << "," << "*p=" << *p << endl; return 0; //輸出a=0,*p=5 }

輸出結果為:

a=0,*p=5;

為什麼c++中通過*p修改了值為5,a的值依然為0呢?

因為程式碼中使用&操作時,從符號表中取出a的值,並將值存在一個新分配的地址空間裡,*p指向的是新分配出來的地址,修改的也只是新分配的地址空間裡的值,而a還常量,訪問時還是從符號表中取出原來的常量值。

二、const和define巨集定義有什麼區別

在c++中const修飾的變數值無法被修改,是否感覺和巨集定義一樣了?但是這兩者是不同的。

const修飾的變數在編譯時是由編譯器處理的,在編譯時檢查值的型別和作用域,例如const int a = 0,int型別的常量,同時在函式中定義的const常量,作用域只在函式內部。

  define修飾的為巨集定義,編譯時由前處理器進行處理,直接進行文字的替換,不會進行型別和作用域檢查。

例項:

#include<iostream>
using namespace std;

void func()
{
    #define name "xiaoming" //
定義一個巨集 const int a = 1;//定義一個區域性變數,用const修飾。 } int main() { func(); cout << "name=" << name << endl;//輸出name=xiaoming cout << "a=" << a << endl;//編譯報錯,因為a的作用域在func內。 return 0; }

三、const修飾指標

const修飾指標分類兩種情況,也是比較容易混淆的。這兩種情況分別是:允許修改指標指向的地址中的內容和允許修改指標指的值(指向別的地址)。

3.1允許修改指標指向的地址中的內容(const位於*的右側)

指標常量,不能修改指標的值,也就值指標指向的地址,但是可以修改指標指向的地址中的內容,常量指標定義是必須初始化,不能指向空。

例如:int *const p = &a;

我們可以這樣理解,const修飾的是p,p是個常量,p的值是指向物件的地址,p是常量不能修改,所以不能重新賦別的值給p,也就是不能修改p的指向,類似於引用&。

例項:

#include<iostream>
using namespace std;


int main()
{
    int num1 = 1, num2 = 2;
    int * const p = &num1;//常量指標
    //p = &num2;//錯誤,不能修改p的值。
    *p = 10;//這個是允許的,修改的是p指向的地址中的內容,也就是*p
    cout << "num1=" << num1 << endl;//輸出num1=10
    return 0;
}

3.2允許修改指標指向的地址(const位於*左側)

常量指標,const修飾指標指向的物件是個常量,不能修改該物件的內容,但是可以修改指標指向別的物件。

例如:const int *p。

我們可以這樣理解,const修飾的是*p,而*p是指p指向的地址的內容,所以表示內容是常量,而p是可以修改的。

例項:

#include<iostream>
using namespace std;

int main()
{
    int num1 = 1, num2 = 2;
    const int *p = &num1;//指標常量
    //*p = 3;//錯誤,不能修改*p的值,*p是常量。
    p = &num2;//這個是允許的,修改的是p,p指向別的物件地址。
    cout << "*p=" << *p << endl;//輸出*p=2
    return 0;
}

四、總結:

const修飾指標時,主要看const在*的左邊還是右邊,決定是指標常量還是常量指標。