不懂頂層const和非頂層const的區別的先檢視我的這篇部落格:
介紹const函式過載的問題前,先介紹一下下面**:
#includeusing namespace std;
int ans = 42;
void fun(int *tt)
int main()
int main()
int main()
int c_fun(int *const p); //重複定義
int fun(int p);
int fun(const int p); //重複宣告
c++ 只說了這樣是重複定義,但是沒有說為什麼。
① 頂層的const 不可以改變指向,而形參指標在呼叫函式內部,改變指標指向,是改變的形參的指向,對實參沒什麼影響。
② 而頂層的const 可以改變指向的內容,而形參指標在呼叫函式內部,可以改變指向內容,同時也改變了實參的指標指向的內容。
呼叫函式中的形參 和 頂層const的作用重疊,所以這重複定義。
(2)底層的const形參和普通形參是可以區別開的,可以實現過載。 c++ 11 上說則通過區分其指向的是常量物件還是非常量物件可以實現過載。如下:
int c_fun(const int *p) //底層 const
int c_fun(int *p)
呼叫 int i = 100; c_fun (&i);首先可以呼叫普通形參的函式(第二函式),當把第二個函式去掉時,它也可以呼叫第一函式 int c_fun(const int *p) ,因為下面在定義時都可以實現,變數指標可以初始化(定義)常量指標,但是const底層常量指標不能賦予變數指標
int i = 42;
int *pp = &i;
const int *fd_pp = pp; // 非頂層const 反過來 pp = fd_pp;這樣不行。
int *const d_pp = pp; // 頂層const
那麼為什麼他們兩個函式可以實現過載呢?
這時候就要分析形參的特性 和 非頂層const 的特性了
① 非頂層的const,本身就能改變指標指向,但是在形參指標在呼叫函式內部改變了指標指向,卻對實參不起作用。
② 但是它不可以改變指標指向數的值,而不管是頂層const指標,還是普通指標,都可以改變指標指向內容的值,一旦改變就會就會影響實參。
可以看到作用互斥。可以過載。
注意如下:這樣呼叫就是常量指標了,對實參不能起任何影響
#includeusing namespace std;
int ans = 42;
//這樣引用就是常量引用了,即不可以改變實參的指標的指向,也不可以改變實參指標指向的內容
void fun(const int *tt)
int main()
再看一下這個:
#includeusing namespace std;
void fun(int *tt)
int main()
上面的特徵應該和const int *p 和 int *const p;
const int *p 這裡const 修飾的是int,而int定義的是乙個整值,所以這裡 p為指向常量的指標。
int *const a 這裡const修飾的是 a ,a代表的是乙個指標位址,a就是常量指標。
最後注意一點:
(1)編譯器會找到乙個與實參最佳匹配的函式,並生成呼叫函式的**。
(2)找不到任何乙個函式與呼叫的實參匹配,此時編譯器發出無匹配的錯誤資訊。
(3)有多於乙個函式可以匹配,但是每乙個都不是明顯的最佳選擇時,此時也將發生錯誤,稱為二義性呼叫。
歡迎指正。。。
C 頂層const,頂層const,引用總結
頂層 const 表示的是指標本身是乙個常量,底層const 表示的是指標所指的物件是乙個常量。頂層const拷貝遵守原則 1.const常量不能改變。2.頂層可忽略。const int a 12 int b a 頂層忽略3 非常量可向常量轉換,const int c b 底層const拷貝,則要求...
頂層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 表示的是指標所指的物件是乙...