编译给会为一个空类声明一个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操作符。