C++ const 引用 指针答疑
常變量 const int a
常引用 const int &a
常指針 const int *a
const * int a
用法1:常量
? ? 取代了C中的宏定義,聲明時必須進行初始化(!c++類中則不然)。const限制了常量的使用方式,并沒有描述常量應該如何分配。如果編譯器知道了某const的所有使用,它甚至可以不為該const分配空間。最簡單的常見情況就是常量的值在編譯時已知,而且不需要分配存儲。―《C++ Program Language》
??? 用const聲明的變量雖然增加了分配空間,但是可以保證類型安全。
? ? C標準中,const定義的常量是全局的,C++中視聲明位置而定。
用法2:指針和常量
? ? 使用指針時涉及到兩個對象:該指針本身和被它所指的對象。將一個指針的聲明用const“預先固定”將使那個對象而不是使這個指針成為常量。要將指針本身而不是被指對象聲明為常量,必須使用聲明運算符*const。
? ? 所以出現在 * 之前的const是作為基礎類型的一部分:
char *const cp; //到char的const指針
char const *pc1; //到const char的指針
const char *pc2; //到const char的指針(后兩個聲明是等同的)
? ? 從右向左讀的記憶方式:
cp is a const pointer to char. 故pc不能指向別的字符串,但可以修改其指向的字符串的內容
pc2 is a pointer to const char. 故*pc2的內容不可以改變,但pc2可以指向別的字符串
且注意:允許把非 const 對象的地址賦給指向 const 對象的指針,不允許把一個 const 對象的地址賦給一個普通的、非 const 對象的指針。
用法3:const修飾函數傳入參數
? ? 將函數傳入參數聲明為const,以指明使用這種參數僅僅是為了效率的原因,而不是想讓調用函數能夠修改對象的值。同理,將指針參數聲明為const,函數將不修改由這個參數所指的對象。
? ? 通常修飾指針參數和引用參數:
void Fun( const A *in); //修飾指針型傳入參數
void Fun(const A &in); //修飾引用型傳入參數
引用&的作用:例如a=&b,那么表示a是b的別名,此時a和b的地址相同。在子函數中調用時,形參的改變就是實參的改變,不像C中需要用到指針來實現。
子函數調用時,并沒有申請一個空間來存放形參b,也不用將實參a的值傳給形參b,因此使程序運行更簡化。
參考自https://blog.csdn.net/tom__chen/article/details/22206459
用法4:修飾函數返回值
? ? 可以阻止用戶修改返回值。返回值也要相應的付給一個常量或常指針。
用法5:const修飾成員函數(c++特性)
const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數,包括const成員函數;
const對象的成員是不能修改的,而通過指針維護的對象確實可以修改的;
const成員函數不可以修改對象的數據,不管對象是否具有const性質。編譯時以是否修改成員數據為依據進行檢查。
不加引用的話,str則被復制一份,函數中對str的操作實質上是對其復制品的操作,所以即使在函數中修改了str,調用層的原str并不會被改變。
加了引用的話,傳入的str即是調用層的實際參數,這樣省卻了復制過程,效率會有提高。但如果函數中修改了str,則原str也會改變,因為其實是同一個東西。
有時候為了追求效率,又希望避免改變原來的str,則可在引用的基礎上加const修飾,這樣函數中就不能再修改str的內容(否則會編譯出錯)
用法5:const與指針
int *ptr;
const int *ciptr;
int const *icptr;
int * const cptr;
const int * const cicptr;
上面是關于const與指針結合時的各種情況,這并不只是C++中經常遇到的問題,在C語言中也會有類似的討論,雖然const并不是C語言中的關鍵字。
int * ptr 是指定義一個指向int 類型的指針ptr。
const int *ciptr 是指定義一個指向const int 類型的指針ciptr,這是const 限定的是(* ciptr),也就是對指針解引用,即const限定的就是數據本身,而非指針。所以ciptr是一個指向常int型數據的指針。
int const * icptr其實和上面的const int *ciptr是一致的因為const只是一個限定符,在int前還是后都 沒有影響,他限定的仍然是(*icptr),并不是icptr,也就是icptr也是指向常int型數據的指針,也就是說在icptr這個指針看來,它指向的數據是常數,是不能改變的,但是是否真的不能改變,需要依據實際的類型的分析,只是不能通過這個指針來改變。也就是說該指針是一個自以為自己指向常量的指針。
int * const cptr 這時候我們還是結合const的位置分析,const限定的是cptr,cptr我們可以知道是一個指針,也就是說const限定的是一個指針,而不是指針指向的數據,也就是說這種定義實質上是定義一個常指針,也就是指針指向的地址是不變的,也就是cptr是不能被賦值的,不能采用這個指針指向其他的對象或者地址。但是這個地址中的數據并不是常數,是可以改變的,可以通過對*cptr進行修改。這種指針實質上也就使得指針的效果大大減小,并不常用。
const int * const cicptr 這種定義結合上面的分析我們知道是一個指向常量的常指針,也就說這個指針指向的地址是一個常地址,指針不能指向其他的對象或者地址。同時對指針cicptr來說,我指向的這個地址中的內容也是不能修改的,是一個常量,是不能修改的,但是該地址的數據能否修改還需要進行實際的分析。
參考自http://www.eepw.com.cn/article/201612/324522.htm
http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html
總結
以上是生活随笔為你收集整理的C++ const 引用 指针答疑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序语言功能
- 下一篇: C++编译运行过程分析