// 配置單一物件並初始化
int* p = new int(100);
// 配置陣列
int* arr = new int[10]; // 預設初始化 (非 POD 不保證歸零)
delete[] arr; // 必須配對使用 delete[]
// 非 POD 類別:自動呼叫建構/解構函數
class Widget { public: Widget(int x); ~Widget(); };
Widget* w = new Widget(42); // 建構函數帶參數
delete w;
優勢:型別安全 (無需轉型)、內建 sizeof、支援初始化、可多載/置換全域/類別專屬 operator new。
// 巨集缺陷:abs(i++) 展開為 ((i++) < 0 ? -(i++) : (i++)) → i 遞增兩次
#define ABS(x) ((x) < 0 ? -(x) : (x))
// inline 函數:型別安全、單次求值、除錯可設中斷點
inline int abs(int x) { return x < 0 ? -x : x; }
// 類別內定義隱含 inline
class Math {
static inline int max(int a, int b) { return a > b ? a : b; }
};
注意:inline 僅是建議,編譯器可能拒絕 (函數過大、遞迴、虛函數)。過度內聯導致指令快取未命中、程式碼膨脹。
// C 風格:名稱編碼型別資訊
void PutHz(char* str);
void PutHzAt(int x, int y, char* str);
// C++ 多載:同名語意分組,編譯器依參數簽章解析
void PutHz(char* str); // 當前位置
void PutHz(int x, int y, char* str); // 指定座標
void PutHz(const std::string& str); // 支援 string
限制:僅靠回傳型別不同**無法**構成多載。預設參數與多載結合時需避免二義性。
// C 風格:呼叫端需取址,函數內解參考
void Add(int* a) { (*a)++; }
int x = 0; Add(&x);
// C++ 參考:語法透明,不可為 null,別名語意清晰
void Add(int& a) { a++; }
int x = 0; Add(x); // 呼叫如同傳值,實為傳址
// const 參考:避免大型物件拷貝,承諾不修改
void Print(const BigObject& obj);
核心差異:參考初始化後不可重新繫結、不可為 null、無指標運算,編譯器強制語意安全。