四大預設成員函式
- 預設建構函式(
Foo())
- 複製建構函式(
Foo(const Foo&))
- 複製賦值運算子(
Foo& operator=(const Foo&))
- 解構函式(
~Foo())
C++11 顯式控制
= default:要求編譯器產生預設實作(可用於公開/私有、內聯/非內聯)。
= delete:刪除該函式,禁止使用(如禁止複製)。
程式碼
/* test.cpp
* Created on: 2014.04.14
* Author: Spike
*/
#include <iostream>
#include <string>
using namespace std;
class Foo {
public:
Foo(string _name) : m_name(_name) {}
void say() { cout << m_name << endl; }
Foo(const Foo&) = default;
Foo& operator=(const Foo&) = default;
~Foo() = default;
private:
string m_name;
};
int main() {
Foo F1("Wang");
Foo F2(F1); // 複製建構
Foo F3 = F2; // 複製建構(複製初始化)
F2.say();
F3.say();
return 0;
}
輸出
Wang
Wang
最佳實務
- 若類別管理資源(記憶體、檔案控制代碼、鎖),必須自訂複製/移動語意(Rule of Five)。
- 不需複製的類別(如 singleton、RAII wrapper)應
= delete 複製操作。
- 預設解構函式為非虛擬,基類別若需多態刪除,必須宣告
virtual ~Base()。