C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值)

20180306 C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值)


当你写下一个空类:
class Empty{  };


当C++处理它之后,就会变成如下形似:
class Empty
{
  public:
    Empty() {...}//默认的构造函数
    Empty(const Empty& rhs){...}//拷贝构造函数
    ~Empty(){...}//析构函数,是否应该是virtual,
                  //见稍后说明
    Empty& operator = (const Empty& rhs){...}//拷贝
                          //赋值(copy assignment)操纵符
};
只有当这些函数被需要时(被调用),它们才会被编译器创建出来,下面代码造成上述每一个函数被编译器产生:
Empty e1;//默认的(default)构造函数
         //析构函数
Empty e2(e1);//拷贝(copy)构造函数


e2 = e1;//拷贝赋值(copy assignment)操作符














"内含referrnce成员"的class内支持赋值操作问题:


假设NamedObject定义如下,其中nameValue是个reference to string,objectvalue是个const T:


template
class NamedObject{
pulic:
  //以下构造函数如今不再接受一个const名称,因为nameValue
  //如今是个reference-to-non-const string。先前那个char*构造  //函数已经过去了,因为必须有个string看供指涉。
  NameObject(std::string& name,const T& value);
  ...         //如今,假设并未声明 operator=
  
private:
  std::string& nameValue;//这如今是个reference
  const T objectValue;//这如今是个const
};




现在考虑下面会发生什么:


std::string newPerson("mingming");
std::string oldPerson("mengmeng");


NameObject p(newPerson,2);//新人两岁了
NameObject s(oldPerson,3);//旧人三岁了


p = s;//现在p的成员变量该发生什么事???






面对以上代码,C++的相应是拒绝编译那一行赋值操作(p = s;),如果你打算在一个"内含reference成员"的class内支持赋值操作(assignment),你必须自己定义copy assignment操作符。面对"内含const成员"(如本例之objectValue)的classes,编译器的反应也一样。更改const成员是不合法的,所以编译器不知道如何在他自己生成的赋值函数内面对它们。最后还有一种情况:若某个base classes将copy assignment操作符声明为private,编译器将拒绝为其derived classes生成一个copy assignment操作符。毕竟编译器为derived classes所生的copy assignment操作符想象中可以处理base class成分,但它们当然无法调用derived class无权调用的成员函数。编译器两手一摊,无能为力。






注意:
编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及析构函数。


你可能感兴趣的:(C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值))