Effective Modern C++ 之 特种成员函数

  • 首先我们应该知道:特种成员函数是由C++编译器自动生成的函数。C++的特种成员函数包括:析构函数,默认构造函数,析构函数,复制构造函数,复制赋值运算符,移动构造函数,移动赋值运算符。
  • 当我们使用移动构造函数和移动复制运算符时,其实质是:支持移动操作的成员上执行移动操作,不支持移动操作的成员上执行复制操作。
  • 生成移动操作的精确条件和复制操作的精确条件是不同的。
  1. 两种复制操作时批次独立的,声明了其中一个,并不会阻止C++编译器为我们生成另一个。
  2. 两种移动操作并不批次独立,声明了其中一个,就会阻止C++编译器生成另一个。
  • 如果我们自行定义了复制操作,那么编译器就不会为我们生成移动操作了。因为自行定义复制操作的行为表明对象的常规复制(由C++编译器为我们生成的复制操作)途径不适用,C++编译器从而判定,既然按成员复制(由C++编译器为我们生成的复制操作)不适用于复制操作,则按成员移动(由C++编译器为我们生成的移动操作)极有可能也不适用于移动操作。
  • 如果我们声明了复制构造函数,复制复制运算符和析构函数的其中一个,那么我们也应该同时声明其他两个。因为如果要改写复制操作的需求,往往意味着该类需要执行某种资源管理,而这就意味着:
  1. 在一种复制操作中进行的任何资源(内存)管理,也极有可能在另一种复制操作中需要进行。
  2. 该类的析构函数也会参与到该资源(内存)的管理中。
  • 因此我们便可知道只要用户自行定义了析构函数,就不会生成移动操作。
  • 移动操作生成条件的仅当以下三个同时成立:
  1. 该类未声明任何复制操作。
  2. 该类未声明任何移动操作。
  3. 该类未声明任何析构函数。
  • 有时候我们觉得C++编译器为我们声明的特种成员函数便以足以。这是我们可以通过“=default”来显示地表示这个想法。这样可以清晰的表明用户的意图,并可以防止错过一些非常的微妙的缺陷。
  • 成员函数模板的存在也会阻止编译器生成任何特种成员函数。
发布了66 篇原创文章 · 获赞 11 · 访问量 4735

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/104219808