C 隨筆二 拷貝構造 虛函式(多型)引用

2021-10-04 16:45:44 字數 3149 閱讀 8122

int x=4;

int&y = x;

void

test

(const

int&i)

test(3

);//成功了 ,為什麼可以這樣我也不知道?????

缺點

void fun1 (

int&x)

void

fun2

(int x)

intmain()

也就是說,對於使用引用型別引數的函式,僅僅通過函式呼叫是無法知道fun(y),這個傳進去的y是拷貝還是引用,無法確定y會不會在函式內被改變。

二、引用的限制, 引用和指標一起用的效果

no references to references// && 是非法的

no pointers to references

int

&* p;

//error

離p近的是* 因此p是乙個指標型別,它指向的是乙個int型別的引用。 也就是說p儲存的是引用的位址。我們知道引用的位址是無法獲取到的(獲取到的是引用所引用的變數的位址),因此int &* p;是不可行的。

reference to pointer is ok

void

fun(

int*

& p)

// it's ok

離p近的是&,因此p是乙個引用型別,所引用物件是乙個指向int型別的指標。這是可行的。

no arrays of references下面我們來看乙個可以欺騙編譯器的指標並越權使用的例子

classa;

void

fun();

};

我們知道const型別(b)的變數是不可以改變的,類中private的變數(a)外界是無法直接訪問的,但其實通過指標是統統可以做到的。

int

main()

在上述**中,a物件的乙個私有變數a 和 私有且是const型別的變數b,均可以通過指標來訪問並肆無忌憚的修改。 c++的物件其實就像是乙個指標陣列,可以通過位址偏移來訪問成員表。c++之所以留下這種這些不安全的機制,可能是為了更好的相容c語言吧。

一、用法

一、先看用法舉例

classa;

classb:

public a

;int

main()

void

fun(a * pr)

;int

main()

二、虛函式實現原理

需要注意的是:

如果基類有虛函式,那麼派生類重寫了這個虛函式,但函式前面不寫vistual,那麼這個派生類的函式也是虛函式

如果基類某個函式不是虛函式,那麼派生類即便重寫了這個非虛函式,且還加上visual,也無法實現多型,因為父類這個函式不是虛函式。

建構函式不能為虛函式。

基類的析構函式應該為虛函式。

友元函式不能為虛,因為友元函式不是類成員,只有類成員才能是虛函式。

這篇部落格寫的非常好

函式重寫:也稱作覆蓋,是用於類的繼承中,函式名、引數個數、型別都相同,僅函式體不同。 //基類函式必須是虛函式

函式過載:是指同一作用域的不同函式使用相同的函式名,但是引數個數或型別不同。

函式隱藏:既不是過載也不是重寫,例如:函式名及引數完全相同卻又不是虛函式,卻在子類中重新實現該函式,也就是所謂的隱藏。(有點像是不同作用域的』過載』)

函式隱藏:

函式重寫、覆蓋:

函式過載

一、先看例子

int num=0;

//用於計數

classb;

~b()

;};void

fun(b b)

;int

main()

執行結果如下:

call the b()

, num =

1call the fun

(b b)

, num =

1//明明建立了物件b, 但卻沒有呼叫對應b()建構函式

call the ~b(

), num =

0call the ~b(

), num =-1

press any key to continue

可以明顯的看到詭異之處,fun(b b)這個函式中雖然初始化了乙個物件b,但卻沒有呼叫建構函式,卻使用了析構函式,從而導致num 最終不是0了。

二、原理

b b =10;

//這就相當於b b(10);

如果類中有指標型變數的話,那麼如果使用了系統預設的拷貝構造之後將會出現很大的問題。通過拷貝建構函式初始化的新物件 中的指標型變數 所指向位址和被拷貝的物件中 的指標型變數 所指向的位址完全一樣。這樣就會進行兩次delete操作 重複釋放記憶體, 就會報錯。

因此當類中存在指標型變數時,要自己重寫乙個拷貝建構函式,為指標型變數新分配一塊記憶體。另外,這裡給乙個建議:乙個類建立之後,最好要有三個函式:預設建構函式、虛析構函式、拷貝建構函式

四、補充

所謂淺拷貝,就是說編譯器提供的預設的拷貝建構函式和賦值運算子過載函式,僅僅是將物件中各個資料成員的值拷貝給另乙個同乙個類物件對應的資料成員。

在`深拷貝情況下,對於物件中動態成員,就不能僅僅簡單地賦值,而應該重新動態分配空間。

詳細內容待需要時在深究。

C 拷貝引用建構函式

class man using namespace std man man age 0 name null 以拷貝的方式初始化函式,指向自己類的乙個引用 man man const man it 對有引數的初始化函式分配記憶體 man man const char s,inti 析構函式 man m...

C 引用和拷貝建構函式

1,c 中的指標 c 是一種型別要求更強的語言,不允許隨便把乙個型別的指標指派給另乙個型別。2,c 中的引用 引用,就像自動被編譯器逆向引用的常量型指標。使用引用的規則 a,必須初始化 b,一旦乙個引用被初始化為指向乙個物件,就不能被改變為對另乙個物件的引用。c,不可能有null引用。必須確保引用和...

c 拷貝建構函式引用傳參

看一道c 面試題 給出下述 分析編譯執行的結果,並提供3個選項 a.編譯錯誤 b.編譯成功,執行時程式崩潰 c.編譯執行正常,輸出10 class a private int value public a int n a a other void print int main a a 10 a b ...