先說乙個小發現,在delete 的時候,是按照與構造順序相反的順序來析構的!(原來的構造順序指的是,new 的時候,是按照下標順序構造的)
#include
using
namespace
std;
class log
~log()
private:
int id;
};int main()
上面**的輸出結果為:
destruct 3
destruct 2
destruct 1
destruct 0
據說編譯器內部是通過「常量指標」來實現引用的,首先從它的大小來看一下:
#include
using
namespace
std;
class log
~log()
private:
int id;
};};
int main()
輸出結果是:8 4
8是乙個指標的大小!ps,不能直接通過sizeof(ref)來判斷,因為這樣會輸出4 4
,計算的是ref所引用的物件的大小。
下乙個主題需要區分指標(型別的)常量和(指向)常量(的)指標,相信看了左邊括號裡的注釋,應該都清楚了吧?
還不清楚,只能po我自己的私藏筆記了:
常量指標,顧名思義,就是指向乙個常量的指標,比如:
const
intid = 555;
const
int* p1 = &id;
intconst* p2 = &id;
*p1 = 233; // 錯誤!不允許通過指標修改變數的值,因為指向的是常量
int hello = 666;
p1 = p2 = &hello; // 可以給指標重新賦值,指標本身不是常量
它的特點是,不能通過指標去修改所指向變數的值,常用於函式傳參時宣告變數內容不允許被修改(當然也可以用常引用)。
xx常量指的是這個變數是乙個常量,不能修改其值,所以,「指標常量」指的就是這樣的形式:
int
id = 233, id2 = 555;
int* const p = &id;
id = 666;
p = &id2;// 錯誤!p是乙個常量,不允許修改它的值
p = &id;// 錯誤!這樣也不行,不要以為p的值等於&id就可以給它賦值,哼╭(╯^╰)╮
你可以修改原始變數的內容(只要它不是const修飾的),但是不能改變指標的值,也就是說,這個指標就只能被指定為指向這個變數了!
據說,編譯器內部用常量指標來實現引用!(只是傳言而已)
直接po**,**清晰得,都不用解釋的^_^
#include
#include
#include
#include
#include
#include
using namespace std;
class log
log& operator = (const log& rhs)
void display() const
private:
int id;
};templateclass reference
t& operator = (t& object)
};int main()
輸出結果是:
log
233log
666
C 析構函式 虛析構函式
1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...
C 析構函式
析構函式 destructor 也是乙個特殊的成員函式,它的作用與建構函式相反,它的名字是類名的前面加乙個 符號。在c 中 是位取反運算子,從這點也可以想到,析構函式是與建構函式作用相反的函式。當物件的生命期結束時,會自動執行析構函式。具體地說如果出現以下幾種情況,程式就會執行析構函式 1.如果在乙...
C 析構函式
之前一直想看c 中,子類 基類的析構函式的呼叫過程,使用編輯器vs時,要使執行視窗不消失就需要在main函式中的return 0 語句之前加上system pasue 或getch 之類的語句,這種方式使得一直無法執行到析構函式,無法檢視析構函式的呼叫過程 解決方法 ctrl f5執行程式後會生成....