頂層const和非頂層const和函式過載的問題

2021-10-01 03:59:50 字數 1964 閱讀 4439

不懂頂層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 表示的是指標所指的物件是乙...