new)。A a(10);、A a = 10;(單參數構造,非 explicit)。new 創建時:A* p = new A(10);。void 都不能寫)。inline、可 explicit(防隱式轉換)。class A {
int x;
int& ref;
const float pi;
public:
A(int x1) : ref(x), pi(3.14f) { // 必須用初始化列表
x = x1; // 普通成員可在函數體賦值
}
};
memcpy。Derived(int x) : Base(x), member(x) {}。delete、關閉文件句柄、釋放鎖、關閉網絡連接等。delete 堆上對象:delete p;(單個)、delete[] p;(數組)。~ClassName(),無參數、無返回類型、不可重載、不可帶默認參數。class AAA {
public:
AAA(); ~AAA(); // 僅聲明
};
// AAA() {} // 定義在 cpp 中
// ~AAA() {} // 忘記定義!
int main() {
AAA a; // 編譯通過,鏈接錯誤:undefined reference to AAA::~AAA()
AAA* p = new AAA();
// delete p; // 這行若執行也會鏈接錯誤
}
原因:編譯器自動生成默認構造/析構/拷貝/賦值,但用戶一旦聲明任意一個,編譯器就不再自動生成任何一個。必須全部定義(哪怕是空函數體)。
| 分配方式 | 釋放方式 | 備註 |
|---|---|---|
new T | delete p | 調用 1 次構造、1 次析構 |
new T[N] | delete[] p | 調用 N 次構造、N 次析構(需記錄 N) |
new T | delete[] p | 未定義行為(可能崩潰) |
new T[N] | delete p | 未定義行為(僅析構第 1 個,內存釋放錯誤) |
內置類型(int 等)無析構函數,new int[10] 配 delete p 偶爾能跑通,但極其危險,嚴禁依賴。
new/delete、new[]/delete[] 嚴格配對。