編譯給會為一個空類聲明一個default建構函式、一個copy建構函式、一個copy assignment操作符、和一個解構函式。所有這些都是public且inline:
class Empty{};
就像是寫了這樣的代碼:
class Empty{
Empty(){…}
Empty(const Empty& rhs) {…}
~Empty(){…}
Empty& operator=(const Empty& rhs){…}
};
唯有當這些函數被需要,它們才會被編譯器建立出來。
default建構函式和解構函式,主要做些調用base classes和non-static成員變數的建構函式和解構函式。編譯器產出的解構函式是個non-virtual,除非這個class的base class自身聲明有virtual 解構函式(virtual屬性來自base class)。copy建構函式是以被拷貝的對象的成員變數為初值,構造自己的成員變數, 對於內建類型則是拷貝每一個bits來完成初始化。copy assignment操作符執行基本上和copy構造一樣。
class NameObject{
public:
NameObject(std::string& name, const int& value);
private:
std::string& nameValue;
const int objectValue;
};
inline void test05()
{
std::string newDog("Persephone");
std::string oleDog("Satch");
NameObject p(newDog, 2);
NameObject s(oleDog, 36);
// p = s; //error C2582: 'NameObject' : 'operator =' function is unavailable
}
c++不允許讓reference改指向不同對象,而且不能更改const對象。所以編譯器產生的copy assignment操作符無能為力, 如果想賦值只能自己定義copy assignment操作符了。
如果base classes將copy assignment操作符聲明為private, 編譯器將拒絕為其derived classes產生一個copy assignment操作符。