const使用辨析

發表于:2007-05-25來源:作者:點擊數: 標簽:辨析Const使用
const使用辨析 站長評論:C++程序設計語言作為一門兼有 面向對象 程序設計的優越性,又不失結構化程序設計語言的特點的語言,注定了他在相當長的一段時間內不可能被任何一門語言所取代。這點是毫無疑問的?!禼onst使用辨析》是我們團隊內部討論一個經典的問
const使用辨析

站 長評論:C++程序設計語言作為一門兼有面向對象程序設計的優越性,又不失結構化程序設計語言的特點的語言,注定了他在相當長的一段時間內不可能被任何一 門語言所取代。這點是毫無疑問的?!禼onst使用辨析》是我們團隊內部討論一個經典的問題,現在由C++斑竹楚云整理出來并加以分析,以求能為大家對 clearcase/" target="_blank" >cconst的使用及其關鍵語法的理解有所幫助。  zengyi820
-------------------------------------------------------------------
const限定修飾符是C++學習的重點,它主要運用在函數中,用以保護它所修飾的對象,對提高代碼的可靠性有很大幫助,所以“盡可能使用const” (見Effective C++)已經成為C++程序設計的一個準則。不過const的一些基本用法是初學者經常容易混淆的地方,本文就對const一些比較難理解的地方做一個介 紹。

-------------------------------------------------------------------

首先我們來關注一下const的兩種寫法:

const int a = 1024;  //  等同于 int const a = 1024;

這兩種寫法是等價的,一般大多數人都會選擇第一種寫法。不過我認為第二種寫法比較好一點,我來舉個例子:
看過C++ Primer的人應該記得,在講typedef那一節的時候有這么一個語句:

typedef char *cstring;
const cstring cstr;   // 你會理解成什么?

我想很多人一看到上面這個聲明就會認為這是const char *cstr;可惜錯了,const修飾的是cstring,而cstring代表了char *不是char,也就是把指針轉換為常量,即char *const cstr;(關于兩者的區別我將會在下面一節說明)。
如果我們用const的第二種寫法就不會產生誤解了cstring const cstr;是不是很容易理解?所以我建議用第二種寫法(其實我也不太習慣J)。

---------------------------------------------------------------------

我們來看一行語句:
const int p = 1024;   // 如何定義一個指針來指向常量p

下面的定義對嗎?
int *pi = &p;         // 錯了,不能用一個非常量指針指向常量p
const int *pi2 = &p;  // 毫無疑問,這是對的


讓我們再看一個定義:
// 是不是很奇怪?多加一個const,有什么不一樣嗎?
const int *const pi3 = &p;


不一樣,在回答這個問題之前,先解釋一下const int *pi2的微妙之處:
我們可這樣讀這個語句,pi2是一個指針(pi2本身不是常量),它指向一個常量p(它指向的對象p是常量)。這下明白了吧!我們可以給pi2賦其它的值,使它指向不同的對象,卻不能修改pi指向的對象,下面這個例子可以很好的說明這一點。
const int p = 1024;const int *pi2 = &p;
*pi2 = 0;   // 錯了,我們不可以修改p的值
int a = 2;
pi2 = &a    // 可以給pi2賦其它的值

注意:pi2指向的值可以不是const型,但我們仍然不能修改pi2指向的對象。

現在再來看看另一個語句int *const pi4;我們只要把上面的語句反過來想就行了,pi4是一個常量指針,我們不可以修改它,但卻可以改變它指向的對象,HOHO,很簡單吧!再把上面兩個語 句拼起來,得到一個const int *const pi3 = &p;答案出來了J……

---------------------------------------------------------------------

我們再看一個語句
const int &ir = 1024;


奇怪嗎?這個語句是正確的!
原因是這樣的,1024是一個不可尋址的值,對于這樣的值要實現引用,編譯器必需生成一個臨時對象,用引用來指向這個臨時對象才行。

int temp = 1024;      // 給這個臨時對象起個名字temp
const int &ir = temp; // 引用指向的是它

那為什么一定要在int &ir前加一個const呢?假設int &ir正確,這時如果給ir賦個新值就會改變temp的值,是不是很糟糕! 所以要加上const,編譯器才會認為是正確的。

---------------------------------------------------------------------

有了上面兩小節的準備,讓我們來做這么一個題目:
const int p = 1024;


要求用const對象p的地址來初始化一個引用?

這道題有兩個解法,先說第一種,分兩步做:
const int *pi = &p;  // pi本身是非常量指針,指向一個const對象p
const int *&pp = pi; // 引用指向的是非常量指針pi


在這里,pp指向的指針pi是非常量指針,可以重新賦值,但不可以修改p的值。

再看第二種:
const int *const &pi2 = &p;


相信你已經能理解這個語句了^-^!

---------------------------------------------------------------------

好了,寫的差不多了,再寫下去怕人笑話^0^,謝謝你看完這篇小文章,希望能對你有一點幫助,呵呵!讓我們共同進步。

本文的主要參考書籍是  C++ Primer

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97