我们定义一个空类
class Empty {}
等价于
class Empyt {
Empty() {}
Empty(const Empty& rhs) {...}
~Empty() {}
Empty& operator=(const Empty& rhs) {...}
}
默认构造函数
默认拷贝构造函数
默认赋值运算符重载
默认析构函数
这些函数会在被调用的时候创建。
默认拷贝构造函数只是单纯的将每个非静态成员变量拷贝到另一个对象中。
template <typename T>
class NamedObject{
public:
NamedObject(string& name, const T& value)
:nameValue(name), objectValue(value){}
private:
string& nameValue;
const T objectValue;
};
我们定义了一个NamedObject类,用来给对象命个名。这个类有两个成员变量:string引用类型的nameValue和一个const的T对象。注意这两个成员变量的类型,这很重要。
然后我们自己定义了一个构造函数,所以编译器不会为我们定义默认的构造函数。
下面我们使用这个类。首先定义了两个NamedObject对象,然后试图赋值给另一个。
int main() {
string newDog("Persephone");
string oldDog("Satch");
NamedObject<int> p(newDog, 2);
NamedObject<int> s(oldDog, 36);
p = s; // wrong
}
由于我们没有自己写赋值运算符,所以编译器会生成默认赋值运算符重载。但上文谈到,默认的赋值运算符重载是简单的将对象的每个成员函数赋值给另一个。但这里的nameValue成员变量是个string引用。引用可以理解成一个常量指针,它一定与它指向的对象是绑定的。
但是这里如果我们执行赋值操作,本意是想修改p的名字。但这里的p的名字是个newDog对象的引用。如果要赋值的话就会修改newDog的内容。默认的赋值运算符重载能随便修改别的对象的内容吗?
编译器的处理是拒绝执行赋值。因为如果你想通过赋值运算符重载修改别的对象的内容,那么请自己写。
Effective C++ 条款05:了解C++默默编写并调用哪些函数
原文:https://www.cnblogs.com/destinyzk/p/14924485.html