C++語法系列——const的頂層/底層之分

目錄

 

(1)先聲明用處

(2)除指針外,頂層或底層const這一說法對其他對象適用嗎?

(3)頂層/底層const在函數重載時有何區別?

(4)頂層/底層const在初始化有何區別?


(1)先聲明用處

頂層/底層通常用於修飾在定義指針時出現的const,即不可修改針對的是指針存儲的地址,還是指向的對象。

a. 指針存儲的地址不可修改,則const是頂層的,如

 int* const ptr;

b. 指針指向的對象(內容)不可修改,則const是底層的,如

const int* ptr;

c. 兩者均不可修改,則一個const是頂層的,另一個const是底層的,如

const int* const ptr;

(2)除指針外,頂層或底層const這一說法對其他對象適用嗎?

C++ primer P57 2.4.3告訴我們的答案是 yes 。

a. 對於int,double,string,vector...等對象,其const始終是頂層的,即對象存儲的內容不可修改 ;

b. 對於對象引用,其const始終是底層的,即引用所指向的對象(內容)不可修改

(3)頂層/底層const在函數重載時有何區別?

底層const可用於函數重載,而頂層const不可

void print( int* ptr ); 
void print( int* const ptr ); //頂層const,函數重載不成功

void print( int i );
void print( const int i ); //頂層const,函數重載不成功
void print( int* ptr );
void print( const int* ptr ); //底層const,函數重載成功

void print( int& p );
void print( const int& p ); //底層const,函數重載成功

(4)頂層/底層const在初始化有何區別?

a. 頂層const修飾的對象在定義時必須值初始化,不能默認初始化;

b. 底層const修飾的對象(僅討論指針,對象引用除外)在定義時可以默認初始化

int* const ptr;
const int i; //頂層const,執行默認初始化出錯

int* const ptr = &a;
const int i = 5; // 頂層const,正確執行值初始化
const int* ptr; //底層const,正確執行默認初始化
const int* ptr = &a; //底層const,正確執行值初始化

修飾引用的const也屬於底層const,爲何不能默認初始化?——引用本身的特性決定:引用必須在定義時與某對象綁定

const int& p; //默認初始化出錯
const int& p = a; //值初始化正確

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章