C++常量詳解一(常量指針與常量引用的初始化)。本站提示廣大學習愛好者:(C++常量詳解一(常量指針與常量引用的初始化))文章只能為提供參考,不一定能成為您想要的結果。以下是C++常量詳解一(常量指針與常量引用的初始化)正文
作者:Jang1996
這篇文章主要介紹了C++常量詳解一(常量指針與常量引用的初始化),需要的朋友可以參考下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.1.1分清了const對象後,讓我們先把目光聚集到const對象這裡。
const對象可以分為大致三類:
const int m int *const p const int *const q
而這前兩類都可以用來給非const對象或者const對象初始化,因為這前兩類都是頂層const,初始化時的拷貝是不會對他們的自身值做出什麼改變,即以下代碼均正確。
//第一類 int m1=m;//正確 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 int *p3; const int *const p4; int *const 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的對象。
以上就是關於涉及到常量的指針和引用的初始化的解釋了。