C 頂層const和底層const

2021-09-26 06:47:28 字數 1789 閱讀 6574

當我們定義指標和變數的時候,有時候希望定義成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 表示的是指標所指的物件是乙...