天天看點

C++中const限定符的一些用法

以下是一些零碎的用法總結,其中若有錯誤之處,希望大家提出批評,我定會認真修正。

1:在預設的情況下,在全局作用域聲明的const變量是定義該對象的檔案的局部變量。在其他檔案中是不能通路的。要想讓在目前位置定義的const變量能夠被其他檔案所通路,則必須在該檔案定義是聲明他是一個外部變量,方法是在前面加上extern(而非const變量則預設為extern),在其他檔案中使用的話,亦需加extern。

2:const全局變量的作用域為目前檔案的好處:

當const變量為一個常量表達式初始化時,為了讓他在全部源檔案中使用,可以 将它寫入頭檔案之中。在頭檔案中我們知道是不能定義一個非const變量或是一個用非常量表達式初始化的一個const變量,原因是這樣的話避免不了重定義。比如說你在頭檔案bianliang.h中定義了int i = 0;此時i為全局變量,當在檔案bianliang.cpp中使用#include"bianliang.h"時,相當于在目前檔案中bianliang.cpp中又定義了一次i變量(注意bianliang.h,bianliang.cpp是兩個不同的檔案)。

這就好了,我們知道,const變量的作用域為局部,即目前檔案之中,這樣就避免了以上的沖突,但是注意,僅限于const常量表達式。

據《C++ Primer》上的說明:大多數編譯器在編譯時都會用相應的常量表達式來替換這些const變量的使用,是以在實踐中不會有任何存儲空間用于存儲用常量表達式初始化的const變量。

3:const引用:

需要注意的是非const引用隻能綁定到與該引用同類型的對象,而const引用則可以綁定到不同或相關類型的對象或是綁定到右值。

這個《C++ Primer》第四版page52頁有詳細的解釋:這裡我照搬了,僅供參考。。。。。

eg:int i = 42; const int &r=42; const int &r = r+i;

這樣是合法的,而如果改成int &r=42;int &r=r+i就不對了。對于int i = 42; const int &r=42;編譯器會将代碼轉化為如下形式:

int temp = 42; const int r = temp;是以從本質上來看,const和非const引用都是引用同類型的對象。這樣的好處是使被引用的對象不能被修改。

有些參考書上的說明:應盡可能的使用const引用,有一下三個理由:

一、使用const可以避免無意中修改資料的程式設計錯誤。

二、使用const可以使函數能夠處理const和非const實參,否則隻能接受非const資料。

三、使用const引用函數能夠正确的生成并使用臨時變量。(由于非const引用隻能綁定到與其同類型的變量)

4:const指針和指向const的指針

不管對象是否為const類型,都可以用指向const的指針标記。而指向const的指針不管指向哪裡,都預設自己指向的對象時const類型的,是以不能用該指針去更改他所指向的對象。還有要注意必須使用const void*類型的指針儲存const對象的位址,其定義的形式如:const int *i;

const指針則是本身為const,不能被更改。但其指向的對象如果是非cosnt類型的話就可以被修改。定義的形式:int j = 0; int *const i = &j; 

5:利用const引用避免複制實參:

當在向函數傳遞大型對象時,用引用則可以避免大量的複制工作,而使用const引用則更加的安全,可以保護被引用的對象。

6:用const引入常量成員函數:給大家一個網址,上面對此解釋的比較清楚:http://blog.163.com/[email protected]/blog/static/1079032872011913429671/

繼續閱讀