C 中const的用法 03 類

2021-06-28 11:36:40 字數 2565 閱讀 3281

前面介紹了const 在常量與指標和const 在函式中的用法,雖然放在不同的位置會有不同的用法,但歸根結底,const 的思想都沒有變----那就是用來修飾乙個不能被改變的量。

然而,const 在類中的含義有所不同。

下面我們來介紹const在類中的具體情況。

const 不僅被用來修飾類的成員,還可以在類外,是整個例項都作為const ,但類中難免有修改資料成員的函式,因此為了保持統一,c++引進了const 成員函式,const 成員函式只能被const 物件呼叫。

1.類中的const

有時,我們可能遇到如下情況,建立了乙個類,並且希望它的所有例項都有乙個統一且確定的值。對於我們來說,最合乎邏輯的方法就是使用const , 但是很遺憾,這樣做不會產生預期的效果,雖然const 可以是乙個變數常量化,但實際上類中const 修飾的是物件中的成員而非類的。即試劑的作用是為類中的每個物件分配記憶體,這個物件呼叫建構函式完成數初始化,一旦完成,就不能再改變。也就是說,對這個const 修飾的成員函式來說,每個不同的物件都可以擁有乙個不同的const 值。

const 物件必須在定義時完成初始化。不能先分配記憶體,過後再賦值,所以在進入建構函式之前,const 資料成員必須已經被賦值。

#include using namespace std ;

class example

//othre functions

};

這樣的建構函式是錯誤的。因為在引數列表(int x , int y)中,系統會先為 x_ 和 y_ 分配單元,等進入函式體之後,才進行賦值。這顯然與const的概念不符。const 要求所修飾的物件必須在定義的同時就完成初始化。因此,我們應該使用初始化列表來初始化const 物件,使其在進入函式體之前就已經完成初始化。

#include using namespace std ;

class example

//othre functions

};

這樣,cosnt 成員函式 y_ 可以在定義的同時就被初始化。

在c++中,初始化的效率遠高於先分配記憶體再賦值。因此我們可以將一些簡單的建構函式的引數盡量放在初始化列表中以提高效率。

#include using namespace std ;

class example //also safe

//othre functions

};

而初始化列表的順序最好和資料成員的定義順序保持一致,否則有可能把自己往坑里推。

2.編譯期間類中的常量

雖說我們解決了const的問題,但之前問題還是沒有得到解決——如何在類的每個物件中預設乙個固定的值?

答案就是static

static意味著不管這個類的物件被建立多少次,它修飾的物件都只有乙個例項,這正是我們需要的類的常量成員。

#include using namespace std ;

class example

//othre functions

};

static與其他資料成員區別很大,c++中規定不允許在類內初始化資料成員但static可以,並且,假設我建立了100個example類的例項,那麼每個例項都有乙個值為100的const int 。但 z_ 不是他們真正的資料成員,也不和 x_ , y_一樣被分配在棧去。而是只被建立一次,並被分配在靜態儲存區。

3.const物件和成員函式

使用者定義的型別和內建型別一樣,都可以定義const 物件。

const int i = 1 ;

const example a(100) ;

都是合法的定義。

我們定義了乙個const example例項a ,a呼叫建構函式,而之後在該物件的整個生命週期內,都不能修改它的資料成員。

但在實際中如何保證const物件不會呼叫乙個會修改資料成員的成員函式呢?那就是將所有不會修改資料成員的成員函式都宣告為const。 

比如:void display() const

我們應該將所有不會改變資料成員的成員函式都宣告為const ,乙個沒有被宣告為const的成員函式將會被看成會改變資料成員的函式。而且編譯器不允許非它為乙個const成員所呼叫。

簡而言之,乙個被const 修飾的成員函式有以下兩個特徵:

①其中的引數不能被改變,包括不能再呼叫會修改引數的成員函式。

②const物件和非const物件均可以呼叫const成員函式,但const物件不能呼叫非const成員函式

最後還有乙個關鍵字,簡單介紹一下:mutable

用來修飾資料成員,意為在const物件中,該關鍵字修飾的資料成員依然可以被更改

#include using namespace std ;

class example

void add()

void display()

};int main(void)

這樣,cosnt 成員函式 y_ 可以在定義的同時就被初始化。

C 中const的用法

1 const修飾普通變數和指標 1 const修飾普通變數 其寫法有2種 a const type value b type const value 這兩種寫法本質上是一樣的。其含義是 const修飾的型別為type的變數value是不可變的。2 const修飾指標 a const char va...

關於c 中const的用法

1.當然最常用的還是作為常量。1 const int p的用法,表示指向的值得型別不變還是int型,但p的值可以變,可以這樣理解 自以為指向const的指標 可以將非const的物件賦值給他例如可以這樣 int i 3 int j 4 const int p p i cout p p j cout ...

c 中const的用法詳解

const是用於保護程式的健壯性,減少程式隱患。const的用法比較複雜,總結起來又分為以下兩種 1 在定義變數時使用 a const int a 100 最簡單的用法,說明變數a是乙個常變數 b int const b 100 與a功能相同 c const int a b 指向常數的指標,即指標本...