空类
对于一个空类,编译器就会为它声明一个default(默认)构造函数,copy(复制)构造函数,一个copy assignement(复制赋值)操作符和一个析构函数。惟有这些函数被调用,它们才被编译器创建出来。如下所示:
class Empty() {};
//等效于
class Empty{
public:
Empty() {...} //defualt构造函数
Empty(const Empty & rhs){...} //copy构造函数
~Empty(){....} //析构函数
Empty &operator=(const Empty & rhs){...} copy assignement copy操作符
};
对于copy构造函数和copy assignment操作符,编译器创建的版本只是单纯地将来源对象的每一个non-static成员变量拷贝到目标对象。
覆盖
template
class NameObject{
public:
NameObject(const char *name, const T& value);
NameObject(const string &name, const T& value);
.....
private:
string nameValue;
T objectValue;
}
由于其中声明了一个构造函数,编译器就不会再为它创建defualt构造函数。由NamedObject既没有声明copy构造函数,也没有声明copy assigement操作符,所以编译器会为它创建那些函数。但仅仅局限于代码合法且有适当机会证明它有意义。如一下代买
template
class NameObject{
public:
NameObject(string &name, const T& value);
.....
private:
string & nameValue;
const T objectValue;
}
其中C++并不允许让“引用改变所指的对象”,以及更改const成员变量,因此编译器在编译复制构造函数时会报错,停止编译