日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C++ const 引用 指针答疑

發(fā)布時間:2025/3/15 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ const 引用 指针答疑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

常變量 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
? ? 所以出現(xiàn)在 * 之前的const是作為基礎類型的一部分:
char *const cp; //到char的const指針
char const *pc1; //到const char的指針
const char *pc2; //到const char的指針(后兩個聲明是等同的)
? ? 從右向左讀的記憶方式:
cp is a const pointer to char. 故pc不能指向別的字符串,但可以修改其指向的字符串的內(nèi)容
pc2 is a pointer to const char. 故*pc2的內(nèi)容不可以改變,但pc2可以指向別的字符串

且注意:允許把非 const 對象的地址賦給指向 const 對象的指針,不允許把一個 const 對象的地址賦給一個普通的、非 const 對象的指針。

用法3:const修飾函數(shù)傳入?yún)?shù)
? ? 將函數(shù)傳入?yún)?shù)聲明為const,以指明使用這種參數(shù)僅僅是為了效率的原因,而不是想讓調(diào)用函數(shù)能夠修改對象的值。同理,將指針參數(shù)聲明為const,函數(shù)將不修改由這個參數(shù)所指的對象。
? ? 通常修飾指針參數(shù)和引用參數(shù):
void Fun( const A *in); //修飾指針型傳入?yún)?shù)
void Fun(const A &in); //修飾引用型傳入?yún)?shù)

引用&的作用:例如a=&b,那么表示a是b的別名,此時a和b的地址相同。在子函數(shù)中調(diào)用時,形參的改變就是實參的改變,不像C中需要用到指針來實現(xiàn)。

子函數(shù)調(diào)用時,并沒有申請一個空間來存放形參b,也不用將實參a的值傳給形參b,因此使程序運行更簡化。

參考自https://blog.csdn.net/tom__chen/article/details/22206459

用法4:修飾函數(shù)返回值
? ? 可以阻止用戶修改返回值。返回值也要相應的付給一個常量或常指針。

用法5:const修飾成員函數(shù)(c++特性)
const對象只能訪問const成員函數(shù),而非const對象可以訪問任意的成員函數(shù),包括const成員函數(shù);
const對象的成員是不能修改的,而通過指針維護的對象確實可以修改的;
const成員函數(shù)不可以修改對象的數(shù)據(jù),不管對象是否具有const性質(zhì)。編譯時以是否修改成員數(shù)據(jù)為依據(jù)進行檢查。

不加引用的話,str則被復制一份,函數(shù)中對str的操作實質(zhì)上是對其復制品的操作,所以即使在函數(shù)中修改了str,調(diào)用層的原str并不會被改變。
加了引用的話,傳入的str即是調(diào)用層的實際參數(shù),這樣省卻了復制過程,效率會有提高。但如果函數(shù)中修改了str,則原str也會改變,因為其實是同一個東西。
有時候為了追求效率,又希望避免改變原來的str,則可在引用的基礎上加const修飾,這樣函數(shù)中就不能再修改str的內(nèi)容(否則會編譯出錯)

用法5:const與指針

int *ptr;
const int *ciptr;
int const *icptr;
int * const cptr;
const int * const cicptr;

上面是關(guān)于const與指針結(jié)合時的各種情況,這并不只是C++中經(jīng)常遇到的問題,在C語言中也會有類似的討論,雖然const并不是C語言中的關(guān)鍵字。
int * ptr 是指定義一個指向int 類型的指針ptr。
const int *ciptr 是指定義一個指向const int 類型的指針ciptr,這是const 限定的是(* ciptr),也就是對指針解引用,即const限定的就是數(shù)據(jù)本身,而非指針。所以ciptr是一個指向常int型數(shù)據(jù)的指針。
int const * icptr其實和上面的const int *ciptr是一致的因為const只是一個限定符,在int前還是后都 沒有影響,他限定的仍然是(*icptr),并不是icptr,也就是icptr也是指向常int型數(shù)據(jù)的指針,也就是說在icptr這個指針看來,它指向的數(shù)據(jù)是常數(shù),是不能改變的,但是是否真的不能改變,需要依據(jù)實際的類型的分析,只是不能通過這個指針來改變。也就是說該指針是一個自以為自己指向常量的指針。
int * const cptr 這時候我們還是結(jié)合const的位置分析,const限定的是cptr,cptr我們可以知道是一個指針,也就是說const限定的是一個指針,而不是指針指向的數(shù)據(jù),也就是說這種定義實質(zhì)上是定義一個常指針,也就是指針指向的地址是不變的,也就是cptr是不能被賦值的,不能采用這個指針指向其他的對象或者地址。但是這個地址中的數(shù)據(jù)并不是常數(shù),是可以改變的,可以通過對*cptr進行修改。這種指針實質(zhì)上也就使得指針的效果大大減小,并不常用。
const int * const cicptr 這種定義結(jié)合上面的分析我們知道是一個指向常量的常指針,也就說這個指針指向的地址是一個常地址,指針不能指向其他的對象或者地址。同時對指針cicptr來說,我指向的這個地址中的內(nèi)容也是不能修改的,是一個常量,是不能修改的,但是該地址的數(shù)據(jù)能否修改還需要進行實際的分析。

參考自http://www.eepw.com.cn/article/201612/324522.htm

http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html

總結(jié)

以上是生活随笔為你收集整理的C++ const 引用 指针答疑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。