C++中的常數

2020-08-11 16:27:23

C++中的常數

在C語言的學習中,我們已經介紹了變數和常數的內容,但是在C++中關於常數卻有了新的特性,因此下面 下麪九江講解C++中的常數

所謂常數是指不能修改值的量

在C++中,常數可以是以下形式

  • 字面常數
  • 關鍵字const宣告的常數
  • 關鍵字constexpr宣告的常數表達式(C++11新增的特性)
  • 關鍵字enum中宣告的列舉常數
  • 使用#define定義的常數(不推薦使用)

字面常數

字面常數是指我們原始碼中所出現的任何的常數,它可以是任何型別,例如

#include <iostream>
//匯入名稱空間
using namespace std;

//主程式
int main(){
    int num = 10;
    cout << "Hello World !" << endl;

    return 0;
}

在上面的程式中,我們宣告瞭一個變數num並將其初值賦爲10,10是程式碼的一部分,被編譯到最終的二進制程式中,是無法修改的,因此10是一個字面常數

其次,我們輸出了Hello World !,同樣Hello World !作爲程式的一部本被編譯入二進制檔案,是無法修改的常數,因此也是一個字面常數

實際上在C++中,允許使用者定義自己的字面常數,例如37.5_C(攝氏度),97.0_F(華氏度)

這些後綴被編譯器視爲使用者自己定義的字面常數,這一點將在後面講解

關鍵字const宣告常數

我們可以對任意一個變數使用const關鍵字來宣告其爲一個常數,那麼在接下來的程式中,任何爲該變數重新賦值的語句都不會被允許,否則會報錯

並且我們使用const關鍵字宣告一個常數的時候,必須爲其賦予初值,否則將會報錯

使用const關鍵字的最大的好處就是將常數與標識名關聯了起來,這樣便於參照與查詢錯誤

例如

#include <iostream>
//匯入名稱空間
using namespace std;

int main(){
    const int num_1=10;
    return 0;
}

這裏我們申明瞭一個常數num_1並在開始爲其賦予了初值10

關鍵字constexpr宣告常數表達式

使用關鍵字constexpr使得常數的宣告類似與一個函數,而且必須放在主函數外

#include <iostream>
//匯入名稱空間
using namespace std;

constexpr double GetPi(){ return 22.0/7; }

int main(){
    return 0;
}

使用常數表達式的好處就是爲程式的優化提供了可能性

如果我們以下面 下麪的方式宣告一個變數

double Pi=22.0 / 7;

那麼在我們每次參照Pi的時候,編譯器都會重新計算22.0 / 7的值,這樣就造成了效能的開銷

使用常數表達式定義的變數,編譯器只會在定義的時候進行一次計算,在參照的時候就會將變數名直接替換爲該值

此外,我們還能在另外一個常數表達式中參照另外一個常數表達式

#include <iostream>
//匯入名稱空間
using namespace std;

constexpr double GetPi(){ return 22.0/7; }
constexpr double GetDoublePi() { return 2*GetPi(); }

int main(){
    return 0;
}

我們呼叫常數表達式和函數類似

#include <iostream>
//匯入名稱空間
using namespace std;

constexpr double GetPi(){ return 22.0/7; }
constexpr double GetDoublePi() { return 2*GetPi(); }

int main(){
    
    cout << GetPi() << endl;
    cout <<GetDoublePi() << endl;
    return 0;
}

>>>
3.14286
6.28571

最後,常數表達式並不一定能夠實現程式優化,例如定義的常數表達式是返回使用者輸入的數位的兩倍,這樣的話,由於編譯器無法提前預知使用者的輸入,因此是無法提前編譯實現優化的

關鍵字enum宣告的列舉常數

在C語言的學習中,我們講解了使用enum關鍵字定義列舉體以及如何使用列舉變數。

我們使用enum關鍵字定義一個列舉體的本質是將一些常數關聯起來,而定義的列舉體實際上是一種新的數據型別,只不過取值限定在我們所指定的範圍內

因此,在列舉體中列出的量實際上也是常數,我們能夠使用與值關聯的標識名來獲取值

#include <iostream>
//匯入名稱空間
using namespace std;

enum Workday{
    Monday=1,
    Tuesday=2,
    Wednesday=3,
    Thurday=4,
    Friday=5,
    Saturday=6,
    Sunday=7
};

int main(){
    
    cout << "Monday = " << Monday <<endl;
    cout << "Sunday = " << Sunday <<endl;
    return 0;
}

此外,如果我們像爲一個變數賦值爲列舉體中的值,該變數必須爲該列舉型變數

#include <iostream>
//匯入名稱空間
using namespace std;

enum Workday{
    Monday=1,
    Tuesday=2,
    Wednesday=3,
    Thurday=4,
    Friday=5,
    Saturday=6,
    Sunday=7
};

int main(){
    Workday day_1=Monday;
    Workday day_2=Sunday;
    cout << "Monday = " << day_1 <<endl;
    cout << "Sunday = " << day_2 <<endl;
    return 0;
}

使用define定義的常數

使用define定義的常數在c語言的學習中已經講解過,這裏不再講解