const關鍵字細節彙總

2021-10-22 05:52:27 字數 2929 閱讀 6776

關鍵字const多才多藝,你可以用它在class外部修飾global或namespace作用域中的常量,或修飾檔案、函式、或區塊作用域(block scope)中被宣告為static的物件,也可以修飾class內部的static和non-static成員變數。

面對指標,也可以指向指標本身、指標指向物,或兩者都(或都不)是const。

規則:如果const出現在星號左邊,表示被指物是常量;如果出現在星號右邊,表示指標自身是常量;如果出現在星號兩邊,表示被指物和指標兩者都是常量。

如果被指物是常量(const出現在星號左邊),有些習慣將const寫在型別之前,有些習慣會把它寫在型別之後,星號之前,兩者寫法意義相同:

voidf1(

const widget* pw)

;//f1獲得乙個指標,指向乙個常量的(不變的)widget物件

void

f2(widget const

* pw )

;//f2也是

好吧,我承認我喜歡第一種寫法,但是都要懂得這些寫法。

const_iterator這個迭代器不得指向不同的東西,但它所指的東西的值是可以改動的。

注意下面的案例,自己經常弄混。

using

namespace std;

vector<

int> vec;..

.const vevtor<

int>

::iterator iter = vec.

begin()

;*iter =10;

//沒問題,改變iter所指物

++iter;

//錯誤,iter是指標

vector<

int>

::const_iterator citer = vec.

begin()

;*citer =10;

//錯誤,*citer是const

++citer;

//沒問題,改變citer

令函式返回一直常量值,往往可以降低因客戶錯誤而造成的意外,而又不至於放棄安全性和高效性。

舉例:

rational a,b,c;..

.(a * b)

= c;

//在a * b的成果上呼叫operator=

因為此允許對兩值乘積做賦值動物也就沒什麼意思了。將operator*的回傳值宣告為const可以預防這個"沒意思的賦值動作",這就是該那麼做的原因。

將const實施於成員函式的目的,是為了確認該成員函式可作用於const物件身上。

這一類成員函式的重要性在於:

它們使得class介面比較容易被理解。這是因為,得知哪個函式可以改動物件內容而哪個函式不行,很是重要;

它們使"操作const物件"成為可能。而此技術可行的前提是,我們有const成員函式可用於處理取得(並經修飾而成)的const物件。

好吧,我承認我對於原因2難以理解,先說明記錄一下。

對於const成員函式,主要有兩個流行概念:bitwise constness(又稱physical constness)和logical constness。

bitwise constness:指成員函式只是在不更改物件之任何成員變數(除外)時才可以說是const。也就是說它不更改物件內的任何乙個bit。

這種概念會有時候導致反直觀結果。如果乙個更改了"指標所指物"的成員函式雖然不能算是const,但如果只有指標(而非其所指物)隸屬於物件,那麼稱此函式為bitwise const不會引發編譯器異議。例如:

class

ctextblock

private

:char

* ptext;

}const ctextblock cctb

("hello");

//宣告乙個常量物件。

char

* pc =

&cctb[0]

;//呼叫const operator取得乙個指標,指向cctb的資料

*pc =

'j';

//cctb現在有了"jellp"這樣的內容

如果在const成員函式裡面需要更改某個資料怎麼辦?解決辦法就是利用c++的乙個與const相關的擺動場:mutable(可變的)。mutable釋放掉non-static成員變數的bitwise constness約束。具體使用如下:

class

ctextblock

;std::size_t ctextblock

::length()

const

}

如果const成員函式和non-const成員函式**等價時,為避免**重複的安全做法,我們可以使用轉型來處理這一問題。

class

textblock

char

&operator

(std::size_t position)

//現在只呼叫const op..

.};

此處進行了兩次轉型:

*this從其原始型別textblock&轉型為const textblock&

使用const_cast從const operator的返回值中移除const。

需要注意的是,"使用const成員函式呼叫non-const成員函式"是一種錯誤行為,因為物件有可能因為被改動了,這導致使用const修飾的不改動的那個物件被改動了。

目前知識看到這裡,之後繼續更新。

《effective c++》改善程式與設計的55個具體做法——條款03

《c++ primer》第5版

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...

關鍵字const詳解

關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...

const關鍵字用法

const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...