C 常量詳解一 常量指標與常量引用的初始化

2022-10-04 01:09:14 字數 3048 閱讀 8104

1、常量

1.1、常量的初始化:

const物件一旦建立後其值就不能再改變,所以const物件必須初始化。這裡我們要注意一點,像const int *p和const int &r都並不是const物件。因為const int *p只是表示不能通過p改變p所指的物件的值,p的值是可以變的,所以p可以不用初始化。至於r ,引用本身就不是物件,所以r也並不是const物件,r之所以一定初始化,是因為引用必須初始化。對於以上內容,你也可以理解為底層const 修飾的並不是const物件,還要注意像const int *const p1這種,這是一定要初始化的,這是const物件,因為它有乙個頂層const。

1.1ylgifzpp.1分清了const物件後,讓我們先把目光聚集到const物件這裡。

const物件可以分為大致三類:

const int m

int *const p

const int *const q

而這前兩類都可以用來給非const物件或者const物件初始化,因為這前兩類都是頂層const,初始化時的拷貝是不會對他們的自身值做出什麼改變,即以下**均正確。

//第一類

int m1=www.cppcns.comm;//正確

const int m2=m;//正確

//第二類

int *p1=p;//正確

int *const p2=p;//正確

const int *p3=p;//正確

const int *const p4=p;//正確

而第三類則需要我們注意一下,因為第三程式設計客棧類還有乙個底層const。

const int *const q

int *q1=q;//報錯

int *const q2=q;//報錯

const int *q3=q;//正確

const int *const q4=q;//正確

底層const有乙個限制:當執行物件的拷貝操作時,拷入和拷出的物件必須具有相同的底層const。

我們可以這樣理解:const int *const q如果可以拷貝初始化給q1、q2,那麼意味著我們可以通過q1、q1來改變q所指的物件的值,那這樣q的底層const還有什麼意義呢?

以上,是說這三類可以給哪些物件初始化,現在我們看看哪些可以給這三類初始化

第一類const int m

//以下一些變數不初始化,我把重點落在型別。

int m1;

const int m2;

const int m=m1;//正確

const int m=m2;//正確

第二類int *const p

//以下一些變數不初始化,我把重點落在型別。

int *p1;

int *const p2;

const www.cppcns.comint *p3;

const int *const p4;

int *constwww.cppcns.com p=p1;//正確

int *const p=p2;//正確

int *const p=p3;//錯誤

int *const p=p4;//錯誤

這裡的報錯同樣因為底層const有乙個限制:當執行物件的拷貝操作時,拷入和拷出的物件必須具有相同的底層const

第三類 const int *const q

//以下一些變數不初始化,我把重點落在型別。

int *q1;

int *const q2;

const int *q3;

const int *const q4;

const int *const q=q1;//正確

const int *const q=q2;//正確

const int *const q=q3;//正確

const int *const q=q4;//正確

1.1.2 現在讓我們把目光轉回非const物件的初始化

這裡主要有兩類:

//以下一些變數不初始化,我把重點落在型別。

const int *p;

const int &r;

先考慮他們可以給哪些物件初始化

第一類 const int *p

//以下一些變數不初始化,我把重點落在型別。

int *p1=p;//報錯

int *const p2=p;//報錯

const int *p3=p;//正確

const int *const p4=p;//正確

此處同樣由於低層const的限制

第二類 const int &r

//以下一些變數不初始化,我把重點落在型別。

int &r1=r;//錯誤

const int &r2=r;//正確

這裡強調一下,引用不是物件,所以沒有像 int *const &r或者const int *const &r這種形式

好,再考慮哪些可以給他們初始化

第一類 const int *p

//以下一些變數不初始化,我把重點落在型別。

int *p1;

int *const p2;

const int *p3;

const int *const p4;

const int *p=p1;//正確

const int *p=p2;//正確

const int *p=p3;//正確

const int *p=p4;//正確

因為const int *p意義在於表明不可以通過p改變它所指的物件的值,這個物件可以不是常量,只是p所指的物件對於p來說是常量,所以它所指的物件是否const 其實並沒有關係。

第二類 const int &r

//以下一些變數不初始化,我把重點落在型別。

int &r1;

const int &r2;

const int &r=r1;//正確

const int &r=r2;//正確

這裡const同樣是指不能通過r改變它所引用的物件,所以它所引用的物件本身是不是const無關緊要。

縱觀以上的錯誤,都是試圖把底層const拷貝初始化給沒有底層const的物件。

c 指標常量與常量指標詳解

指標常量 顧名思義它就是乙個常量,但是是指標修飾的。定義以後不能再指向其他物件,類似於引用 說明指標變數不允許修改。如同次指標指向乙個位址該位址不能被修改,但是該位址裡的內容可以被修改 int const p 指標常量 int a,b int const p a 指標常量 那麼分為一下兩種操作 p ...

引用,指標,常量引用,常量指標,指標常量的區別

1.指標 指標代表乙個變數的位址 例如 int a 2,b 1,pi a pi b 2.引用 引用即針對乙個變數的別名,引用必須被初始化,引用作為引數 形參 時,不會像指標一樣使用儲存單元,更不會像值傳遞一樣建立該引數的副本,提高空間 時間效率。例如 int a 2,b a 3.常量引用 格式為 c...

C 常量指標與指標常量

c 常量指標與指標常量 1.常量指標 形如 int const p 或 const int p,p稱為 常量指標 例1 include using namespace std int main 執行結果 a的值 30 p的值 30 p重新賦值 40 在例1中,可以看到,p可以先宣告再賦值,而且p可以...