①從儲存空間角度
虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。
問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,
無法找到vtable,所以建構函式不能是虛函式。
②從使用角度
虛函式的作用在於通過父類的指標或者引用來呼叫它的時候能夠變成呼叫子類的那個成員函式。而
建構函式是在建立物件時自動呼叫的,不可能通過父類的指標或者引用去呼叫,
因此也就規定建構函式不能是虛函式。
析構函式可以為虛函式,當析構乙個指向子類的父類指標時,編譯器可以根據虛函式表尋找到子類的析構函式進行呼叫,從而正確釋放子類物件的資源。
如果析構函式不被宣告成虛函式,則編譯器實施靜態繫結,在刪除指向子類的父類指標時,只會呼叫父類的析構函式而不呼叫子類析構函式,這樣就會造成子類物件析構不完全造成記憶體洩漏。
在建構函式中呼叫虛函式,由於當前物件還沒有構造完成,此時呼叫的虛函式指向的是基類的函式實現方式。
在析構函式中呼叫虛函式,此時呼叫的是子類的函式實現方式。
指標函式
指標函式是 返回指標的函式 主體是函式,返回值是乙個指標
基本宣告形式:返回資料型別 + * + 函式名 + (變數型別1,…);
int
*fun
(int
,int);
int*
fun(
int,
int)
;int
*fun
(int
,int
);
函式指標
注意 * 和函式名要用括號括起來,否則因為運算子的優先順序原因就變成指標函式了
#include
intadd
(int x,
int y)
int(
*fun)
(int
,int);
//宣告函式指標
intmain()
(1)常量指標:也叫常指標,最後兩個字是「指標」,代表這是乙個指標,但指向的是乙個常量,如下:
1.
int a =0;
2.const
int*p =
&a;//不可以通過p改變a
(2)指標常量:後面兩個字是「常量」,代表這是個常量,不過是指標型別的常量,
1.
int a =0;
2.int
*const p =
&a;//從後往前看,這是個指標常量,指向的a的值可以改變,但p本身不可改變
注意:如果從**來區分常量指標指標常量,那麼可以從後往前看const的位置,
1.
const
int*p =
&a //從後往前看,const修飾的是*p,所以指標p指向的數值不可變
2.int
*const p =
&a;//從後往前看,const修飾的是p,所以指標p本身不可變
簡單的來說,淺拷貝是增加了乙個指標,指向原來已經存在的記憶體。淺拷貝在多個物件指向一塊空間的時候,釋放乙個空間會導致其他物件所使用的空間也被釋放了,再次釋放便會出現錯誤。
而深拷貝是增加了乙個指標,開闢了一塊空間讓指標指向這塊新開闢的空間。深拷貝和淺拷貝的不同之處,僅僅在於修改了下拷貝建構函式,以及賦值運算子的過載。就類物件而言,相同型別的類物件是通過拷貝建構函式來完成整個複製過程的。
當資料成員中有指標時,必須要用深拷貝。
答:預設拷貝建構函式執行的是淺拷貝,對於凡是包含動態分配成員或包含指標成員的類都應該提供拷貝建構函式;在提供拷貝建構函式的同時,還應該考慮過載"="賦值操作符號。
P4學習筆記(三)P4程式語言簡介
上圖展示了p4語言主要結構,下面簡單講解一下p4的基本語法 header ethernet h header vlan tag h struct my headers ht 基本型別派生型別struct 無序成員集合 typedef bit 48 ethernetaddress typedef bi...
P4合法C識別符號
給定乙個不包含空白符的字串,請判斷是否是c語言合法的識別符號號 注 題目保證這些字串一定不是c語言的保留字 c語言識別符號要求 1.非保留字 2.只包含字母 數字及下劃線 3.不以數字開頭。輸入格式 一行,包含乙個字串,字串中不包含任何空白字元,且長度不大於20。輸出格式 一行,如果它是c語言的合法...
資料結構 P4
include 用指標輸出陣列元素 自己寫的函式是array,老師的是array1 2016年6月1日13 28 52 void show array1 int p a的位址傳遞給了p指標變數,p代表a 0 因此p現在是陣列第乙個元素的位址 void show array int a 自己寫的這個欠...