最近在複習C++,指針這塊真的是重難點,好久了也沒有去理會,今晚好好總結一下const指針,很久沒有寫過博客了,記錄一下~html
const指針的定義:ios
聲明指針時,能夠在類型前或後使用關鍵字const,也可在兩個位置都使用。例如,下面都是合法的聲明,可是含義大不一樣:函數
const int * pOne; //指向整形常量 的指針,它指向的值不能修改post
int * const pTwo; //指向整形的常量指針 ,它不能在指向別的變量,但指向(變量)的值能夠修改。 ui
const int *const pThree; //指向整形常量 的常量指針 。它既不能再指向別的常量,指向的值也不能修改。url
理解這些聲明的技巧在於,查看關鍵字const右邊來肯定什麼被聲明爲常量 ,若是該關鍵字的右邊是類型,則值是常量;若是關鍵字的右邊是指針變量,則指針自己是常量。下面的代碼有助於說明這一點:spa
const int *p1; //the int pointed to is constant
int * const p2; // p2 is constant, it can't point to anything else
const指針和const成員函數指針
能夠將關鍵字用於成員函數。例如:code
class Rectangle { pubilc: ..... void SetLength(int length){itslength = length;} int GetLength() const {return itslength;} //成員函數聲明爲常量
..... private: int itslength; int itswidth; };
當成員函數被聲明爲const時,若是試圖修改對象的數據,編譯器將視爲錯誤。htm
若是聲明瞭一個指向const對象的指針,則經過該指針只能調用const方法(成員函數)。
示例聲明三個不一樣的Rectangle對象:
Rectangle* pRect = new Rectangle; const Rectangle * pConstRect = new Rectangle; //指向const對象 Rectangle* const pConstPtr = new Rectangle;
// pConstRect是指向const對象的指針,它只能使用聲明爲const的成員函數,如GetLength()。
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include <iostream>
using namespace std; int main(int argc, char *argv[]) { int a=3; int b; /*定義指向const的指針(指針指向的內容不能被修改)*/
const int* p1; int const* p2; /*定義const指針(因爲指針自己的值不能改變因此必須得初始化)*/
int* const p3=&a; /*指針自己和它指向的內容都是不能被改變的因此也得初始化*/
const int* const p4=&a; int const* const p5=&b; p1=p2=&a; //正確
*p1=*p2=8; //不正確(指針指向的內容不能被修改)
*p3=5; //正確
p3=p1; //不正確(指針自己的值不能改變)
p4=p5;//不正確 (指針自己和它指向的內容都是不能被改變)
*p4=*p5=4; //不正確(指針自己和它指向的內容都是不能被改變)
return 0; }
const用法小結:
const最經常使用的就是定義常量,除此以外,它還能夠修飾函數的參數、返回值和函數的定義體。
1. const修飾函數的參數
若是參數做輸出用,不論它是什麼數據類型,也不論它採用「指針傳遞」仍是「引用傳遞」,都不能加const 修飾,不然該參數將失去輸出功能。
const 只能修飾輸入參數:
若是輸入參數採用「指針傳遞」,那麼加const 修飾能夠防止意外地改動該指針,起到保護做用。
將「const &」修飾輸入參數的用法總結以下:
(1)對於非內部數據類型的輸入參數,應該將「值傳遞」的方式改成「const 引用傳遞」,目的是提升效率。例如將void Func(A a) 改成void Func(const A &a)。
(2)對於內部數據類型的輸入參數,不要將「值傳遞」的方式改成「const 引用傳遞」。不然既達不到提升效率的目的,又下降了函數的可理解性。例如void Func(int x) 不該該改成void Func(const int &x)。
2. const 修飾函數的返回值
若是給以「指針傳遞」方式的函數返回值加const 修飾,那麼函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。例如函數
const char * GetString(void);
以下語句將出現編譯錯誤:
char *str = GetString();
正確的用法是
const char *str = GetString();
若是返回值不是內部數據類型,將函數A GetA(void) 改寫爲const A & GetA(void)的確能提升效率。但此時千萬千萬要當心,必定要搞清楚函數到底是想返回一個對象的「拷貝」仍是僅返回「別名」就能夠了,不然程序會出錯。
函數返回值採用「引用傳遞」的場合並很少,這種方式通常只出如今類的賦值函數中,目的是爲了實現鏈式表達。
例如:
class A { A & operate = (const A &other); // 賦值函數 }; A a, b, c; // a, b, c 爲A 的對象 a = b = c; // 正常的鏈式賦值 (a = b) = c; // 不正常的鏈式賦值,但合法
若是將賦值函數的返回值加const 修飾,那麼該返回值的內容不容許被改動。上例中,語句 a = b = c 仍然正確,可是語句 (a = b) = c 則是非法的。
3. const修飾成員函數
關於Const函數的幾點規則:
a. const對象只能訪問const成員函數,而非const對象能夠訪問任意的成員函數,包括const成員函數.
b. const對象的成員是不可修改的,然而const對象經過指針維護的對象倒是能夠修改的.
c. const成員函數不能夠修改對象的數據,無論對象是否具備const性質.它在編譯時,以是否修改爲員數據爲依據,進行檢查.
d. 然而加上mutable修飾符的數據成員,對於任何狀況下經過任何手段均可修改,天然此時的const成員函數是能夠修改它的
版權全部,轉載請註明轉載地址:http://www.cnblogs.com/lihuidashen/p/4378884.html