effective C++笔记之条款45: 弄清C++在幕后为你所写、所调用的函数

  • 如果没有声明下列函数,编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值操作符,一个析构函数,一个取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。
  • 当需要的时候需要,这些函数就会被生成。
  • 生成的这些函数中:
  1. 缺省构造函数和析构函数实际上什么也不做,它们只是让你能够创建和销毁类的对象。(33,M24)。生成的析构函数一般是非虚拟的,除非它所在的类是从一个声明了虚析构函数的基类继承而来。缺省取地址运算符只是返回对象的地址。
  2. 缺省构造函数(赋值操作符)对类的非静态数据成员进行“以成员为单位的”逐一拷贝。
  3. 如果想让一个包含引用成员的类支持赋值,就得自己定义赋值运算符,因为C++没有办法让一个引用指向另一个不同的对象。对于包含const成员的类,因为修改const成员是不合法的,所以也得自己定义赋值操作符。如下所示:

template <class T>
class NamedObject
{
public:
         NameObject(string& name, const T& value);
         …
private:
         string& nameValue;
         const T objectValue;
};
string newDog(“Persephone”);
string oldDog(“Satch”);
NamedObject<int> p(newDog, 2);
NamedObject<int> s(oldDog, 29);
p = s;

C++将拒绝编译这段代码。所以如果包含引用成员或const成员的类,就应该自己定义赋值操作符。

  • 如果派生类的基类将标准赋值运算符声明为private,编译器也将拒绝为这个派生类生成赋值操作符。因为编译器为派生类生成的赋值操作符也应该处理基类部分,但这样做的话,就得调用对派生类来说无权访问的基类成员函数。

你可能感兴趣的:(C++,c,String,Class,编译器)