1. 程式人生 > >第3課-進化後的const分析

第3課-進化後的const分析

一、C語言中的const

  • const修飾的變數是只讀的,本質還是變數
  • const修飾的區域性變數在棧上分配空間
  • const修飾的全域性變數在只讀儲存區分配空間
  • const只在編譯器有用,在執行期無用

const修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊

  • C語言中的const使得變數具有只讀屬性
  • const將具有全域性生命週期的變數儲存於只讀儲存區

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

注:C語言中真正意義上的常量只有列舉!

程式設計實驗:C/C++中的const

#include<stdio.h>
int main(){ const int c = 0; int* p = (int*)&c; printf("Begin...\n"); *p = 5; printf("c = %d\n",c); printf("End...\n"); return 0; }

列印結果:

Begin...
c = 0
End...

注:如果使用C語言編譯器進行編譯,則c會變成5,它的值通過指標改變了

二、C++中的const

C++在C的基礎上對const進行了進化處理

  • 當碰見const宣告時在符號表中放入常量
  • 編譯過程中若發現使用常量則直接以符號表中的值替換
  • 編譯過程中若發現下述情況則給對應的常量分配儲存空間
    • const常量使用了extern
    • const常量使用了&操作符

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

這裡寫圖片描述

  • C語言中的const變數

    • C語言中的const變數是只讀變數,會分配儲存空間
  • C++中的const常量

    • 可能分配儲存空間
    • const常量為全域性,並且需要在其它檔案中使用
    • 當使用&操作符對const
      常量取地址
  • C++中的const常量類似於巨集定義

    const int c = 5; // define c 5
  • C++中的const常量與巨集定義不同

    • const常量是由編譯器處理
    • 編譯器對const常量進行型別檢查作用域檢查
    • 巨集定義由前處理器處理,單純地文字替換

程式設計實驗:const 與巨集

#include<iostream>
using namespace std;

void f(){
    #define a 3     //此處為預處理,在編譯之前已經將所有a都進行了替換
    const int b = 4;
}

void g(){
    printf("a = %d\n",a); //此處a已經進行了替換
    //printf("b = %d\n",b);
}

int main(){
    const int A = 1;
    const int B = 1;
    int array[A + B] = {0};//此處若用C語言編譯器,則報錯。因為陣列大小定義使用變數
    int i = 0;
    for(i = 0;i < (A + B);++i)
        printf("array[%d] = %d\n",i,array[i]);
    f();
    g();
    return 0;
}

列印結果:

array[0] = 0
array[1] = 0
a = 3

三、總結

  • 與C語言不同,C++中的const不是隻讀變數
  • C++中的const是一個真正意義上的常量
  • C++編譯器可能會為const常量分配空間(但不會使用,只是為了相容C)
  • C++完全相容C語言中的const常量的語法特性