using namespace std:引入標準庫命名空間static 函數/變量;外部鏈接:extern'\0' 結尾,區別於空字符填充&a == a:數組名即首元素地址非靜態成員函數隱含參數,指向調用對象。編譯器將 obj.func() 轉為 func(&obj)。
static 局部對象:首次調用構造,程序結束析構(單例模式基礎)void func(const Type& obj); // 推薦:避免拷貝,保護數據 void func(const Type* ptr); // 同理
標準 new 拋 std::bad_alloc,可用 nothrow 版本返回 nullptr。
class Shared {
static int count; // 聲明
static void Show(); // 只能訪問靜態成員
};
int Shared::count = 0; // 定義初始化(源文件)
派生類需自定構造/析構,**構造時先調用基類構造**(按繼承聲明順序),析構逆序。
class A { int a; };
class B : virtual public A {}; // 虛繼承
class C : virtual public A {};
class D : public B, public C {}; // D 中只有一份 A::a
虛基類表指針增加對象大小,訪問間接性略降性能。
以類對象作數據成員,構造順序:成員對象構造 → 本類構造。
ptr->virt() → ptr->vptr[index]()Base* p = new Derived; delete p; // Base::~virtual() 確保調用 Derived::~() 再 Base::~()
class Interface {
virtual void Do() = 0; // 純虛
virtual ~Interface() = default; // 介面類必備虛析構
};
[vptr][基類成員][派生類成員]Q: 構造函數能否為虛函數?
A: 不能。構造時對象類型尚未確定,vptr 未初始化完成,無法動態分發。Q: 析構函數為何必須虛?
A: 基類指針刪除派生對象時,需動態調用派生析構釋放資源,再調用基類析構。Q: 虛函數調用開銷?
A: 額外一次間接跳轉(vptr→vtable→函數),現代 CPU 分支預測極佳,可忽略。