定義方式:
inline 關鍵字。目的:減少函數調用開銷,以空間換時間。編譯器對含循環、switch 等複雜函數可能不內聯。
條件:同一作用域(同一類)、函數名相同、參數列表不同(類型、個數、順序)。返回類型不同不構成重載。
注意:帶默認參數的函數易產生二義性。如 void Init(int x=0) 與 void Init() 同時存在會報錯。
唯一區別:默認訪問權限。class 默認 private,struct 默認 public。C++ 中 struct 也可定義成員函數,若所有成員均為 public,則與 class 無異。
本質:編譯器隱式傳遞的第一個參數,指向調用對象。調用 obj.func(args) 實際為 func(&obj, args)。使成員函數知道操作哪個對象的數據成員。成員函數內可省略 this-> 直接訪問成員。
class Test {
int x_;
public:
void Init(int x) { x_ = x; } // 隱式 this->x_ = x;
void Print() const { cout << x_; }
};
struct S { int x; void Set(int v) { x = v; } }; // 默認 public
int main() {
Test t; t.Init(10); // 編譯器轉為 Test::Init(&t, 10)
S s; s.Set(20);
}