目錄
(2)除指針外,頂層或底層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; //值初始化正確