當我們定義指標和變數的時候,有時候希望定義成const型,就是不希望程式中改變自己定義的變數,一旦有**試圖改變定義好的const型的變數,在編譯的時候就會直接報錯。
指標本身也是乙個變數物件,指標所指的變數也是乙個變數物件。當定義const int *p = &i的時候是指標不可變還是變數i不可變呢?這就涉及大了頂層const和底層const的概念。如下的定義方式,有些是頂層const,有的是底層const:
int a =10;
int*
const p1 =
&a;//pi的值不可變,a的值可變。頂層const
const
int b =20;
//變數b的值初始化為20後就不再變化,頂層const
const
int c = a;
//正確,頂層const,c不可變
const
int*p2 =
&b;//p2本身的值可變,p2所指向的b不可變,底層const
const
int*
const p3 =
&b;//靠右側的const是在描述p3本身不可變,為頂層const,靠左側的const描述的是p3所指的物件是否可變,為底層congst
const
int&r = b;
//當使用引用的時候,都是指所引用的物件是否可變,為底層const
即對於指標和普通的變數而言頂層const是指所定義的指標本身或變數本身不可變,指標的底層const指它所指的物件是否可變。引用都是指所引用的物件是否可變,為底層const。
const
int a =10;
int b =20;
int c = a;
//正確,const型可以賦值給非const型,a本身並不受影響
const
int&r = b;
//正確,非const的b可以被引用成const型
int&r1 = a;
//錯誤,const型a只能被const型引用
int*
const p =
&a;//錯誤,p所指的物件是可變的,但a是const的。
一點理解就是要明確const是描述了哪個記憶體單元中內容不可變,要保證記憶體單元中的資料不變,則指向該記憶體單元的指標就必須是const,引用該記憶體單元的引用也需要是const的。
定義乙個c++ class,並且定義const型的類和指標如下:
#ifndef person_h
#define person_h
#include
class
person
void
setage
(int age)
std::string getname()
private
: std::string name_;
int age_;};
#endif
在主程式中定義
const person a
("jack");
person *b =
&a;//錯誤
const person *c =
&a;//正確,指標c的值可變,但c所指的物件a中的內容不可變
c->
setage(10
);//錯誤,試圖改變乙個不可變的記憶體中的內容
const person *
const d =
&a;//正確
C 頂層const和底層const
頂層const表示物件本身是乙個常量 底層const表示不能通過指標或引用改變所指向的物件 例如const int a 42 頂層const,不能改變a的值,int只能有頂層const 指標 int b 12 const int b1 b 底層const,不能通過b1改變a的值,可以理解為b1指向c...
頂層const和底層const
頂層const 本身是乙個常量 底層const 所指的物件是乙個常量 int const p1 i const修飾p1,p1本身是乙個const,所以這個const是頂層const const int ci 42 const修飾ci,ci本身是乙個const,頂層 const int p2 ci c...
頂層const和底層const
1.頂層 const 與底層 const概念 指標本身是乙個物件,因為,指標實際對應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個完全不同的概念,頂層 const表示的是指標本身是乙個常量,底層const 表示的是指標所指的物件是乙...