1. 程式人生 > >const在C和C++編譯中的區別(實現機制)

const在C和C++編譯中的區別(實現機制)

我們都知道在程式中用const,如果是變數,這表示該變數的值不能被修改,,,但是看下面一段C程式碼:

注意在用C編譯,

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int a = 10;
    int *p=(int *)&a;//(int *)先把&i從const int * 轉化為int *
    *p=20;
    printf("a=%d,*p=%d\n",a,*p);
    return 0;
}

C編譯器中給出的結果是: a = 20; *p = 20 (a的值被修改了

而用C++編譯上面的程式碼: a = 10; *p = 20;

為什麼會醬紫呢?那就先從const在C和C++中的實現機制找答案。。。

在C中,const修飾的變數被認為是只讀的變數,該變數肯定是在記憶體中有儲存空間,用指標p指向該塊記憶體,然後就能輕易的修改掉這塊記憶體對應的值;

但是在C++中難道就不能夠修改掉記憶體的值嗎?。。。理想是這樣,現在是C++編譯器起作用的時候了,在編譯階段,C++編譯器會用常量10去替換程式

中對a的引用,所以,根本就沒有改的機會嘛。.(C++中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候摺合在程式碼中,如果加上關鍵字extern或者取const變數地址,則編譯器就要為const分配儲存空間.

)

還有一個要注意的地方:C++編譯器只能對內建資料型別(int , float...)做常數替換,而對於像結構體\類這樣的非內建資料型別編譯器不知道怎麼替換,所以就不替換,

這就和C語言一樣了,可以通過指標修改掉cosnt的值,

比如:

#include <iostream>
using namespace std;

class Test
{
public:
    int a;
    char c;
    Test():a(10),c('c'){}
    ~Test(){}
};

int main()
{
    const Test t;
    cout<<"t.a="<<t.a<<endl;// 結果為10
    int* p = (int *)&t.a;
    *p=20;
    cout<<"t.a="<<t.a<<endl;//j結果為20,被修改了
    return 0;
}