C++ Const(常類型)的作用總結


C++ Const的作用總結

面試或者工作中,我們經常遇到const修飾符定義的變量,函數和對象等。那么const的作用具體是什么,有哪些。今天自己好好的總結了一下,記錄下來方便自己以后時間久了不記得,可以回頭看一下。

在C中,我們都是習慣用#define來定義常量,C++中提供了const修飾符來定義常量,這種方式更靈活,更安全。主要表現在define常量是沒有類型定義的,const常量是類型化的,它有地址,可以用指針指向這個值,但是不能修改它。

Const的使用

  • 和指針一起使用

Const可以和指針一起使用,它們的組合情況比較復雜,可歸納為三種:指向常量的指針,常指針和指向常量的常指針。

(1) 指向常量的指針是指一個指向常量的指針變量,例如:

const char* info = “name”;          // 聲明指向常量的指針

這條語句的含義是:聲明一個名為info的指針變量,它指向一個字符型的常量,初始化為info指向字符串“name”。

所以下面的一句是錯誤的:info [3] = ‘b’;

因為這里指針所指的數據(name)是常量,不能通過解引用來修改該數據。

然后下面這句話是允許的:info = “sex”;

因為指針本身是變量,可以指向其他的內存單元。

(2) 常指針是指把指針本身,而不是它指向的對象聲明為常量,例如:

char * const info = “name”;         // 常指針

這條語句的含義是:聲明一個名為info的指針變量,它指向一個字符型數據的常指針,初始化為“name”的地址。常指針就是創建一個不能移動的固定指針(地址不能改變),但是它所指的數據是可以改變的。

所以下面的一句是錯誤的:info = “sex”;

因為指針本身是常量,不能指向其他的內存單元。

然后下面這句話是允許的:info [3] = ‘b’;

因為指針所指向的數據是可以通過解引用來修改的。

(3) 指向常量的常指針是指這個指針本身不能改變,它所指向的值也不能改變,聲明一個指向常量的常指針,二者都要聲明為const,例如:

const char * const info = “name”;

這里就是上面兩種的結合了,info = “sex”和info [3] = ‘b’都是錯誤的。

其他說明:

  a. 常量一旦建立,在程序的任何地方都不能在修改。

  b. 與#define定義的常量不同,const定義的常量因為有自己的數據類型,這樣C++編譯時就會進行嚴格的類型檢查,具有良好的編譯時的檢測性。

  c. 函數的參數也可以用const說明,用於保證實參在該函數內部不被改動。

  • 常引用

如果在聲明引用是用const修飾,那么該引用就被稱為常引用。常引用所引用的對象不能被更新。如果用常引用做為形參,便不會產生對實參不希望的修改。

定義:const 數據類型 &引用名;

如: int a = 5;

     const int &b = a;

其中,b是一個常引用,它所引用的對象不允許更改,如果出現:

b=6;

則是非法的。(如果你寫a=6,這個不會出問題,因為a不是常類型變量。)

常引用常常被用作形參,例如:

void main()
{
    int a = 10;
    int b = 20;
    add(a, b);
}

int add(cons int &a, const int &b)
{
    // a += 10;         // 非法的,形參a為常引用,不能改變它的值
    return (a + b);
}

 

  • 常對象

如果在聲明對象的時候用const修飾,則稱被聲明的對象為常對象。常對象的數據成員值在對象的整個生命周期內不能被改變。

定義:類名 const 對象名[(參數表)]或者const 類名 對象名[(參數表)]

在定義對象時必須進行初始化,而且不能被更新,C++不允許直接或間接的更改常對象的數據成員。

  • 常對象成員

(1) 常數據成員

類的數據成員可以是常量或常引用,使用const說明的數據成員稱為常數據成員。如果在一個類中聲明了常數據成員,那么構造函數就只能通過初始化列表對該數據成員進行初始化,而任何其他的函數都不能對該成員函數賦值。

(2) 常成員函數

在類中使用關鍵字const的函數稱為常成員函數,常成員函數的格式如下:

返回類型 函數名(參數表)const;

const是函數類型的組成部分,所以在函數的實現部分也要帶關鍵字const。

如:

void showDate() const;       // 聲明
void showDate() const       // 實現
{
    printf(“year”);
}

 

說明:

  a. 如果將一個對象聲明為常對象,則通過該對象只能調用它的常成員函數,而不能調用普通的成員函數。常成員函數是常對象的唯一的對外接口。

  b. 常成員函數不能更新對象的數據成員,也不能調用該類中的普通成員函數,這就保證了在常成員函數中絕對不會更新數據成員的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM