Effective-cpp-#5

Know what functions C++ silently writes and calls

关于类的构造、析构、和拷贝构造、拷贝赋值函数

  • 如果自定义类时没有创建构造函数、析构函数、拷贝构造函数和拷贝赋值函数,编译器会默认为类创建;

  • copy构造函数和copy赋值函数,编译器创建的版本只是简单地将类中每一个non-static对象拷贝到目标对象;

问题

  1. 类中的成员变量为引用类型,此时使用默认函数容易出错;
1
2
3
4
5
6
7
8
9
10
11
12
template<class T>
class NamedObj{
public:
NamedObj(std::string& name, const T& value);
private:
std::string& nameValue;
const T& objValue;
};

NamedObj<int> p("dog", 2);
NamedObj<int> q("cat", 3);
p = s;
  • 倘若该例子没有错,那么p.nameValue和s.nameValue是否指向同一个string呢?如果指向同一个对象,你们就意味着reference被改变了,但是C++不允许reference改变指向不同的对象
  • 此时,编译器会拒绝编译这一行的赋值;
  1. 同理,对面对const成员变量也一样。由于更改const是不合法的,因此编译器也会拒绝进行赋值;

  2. 如果某个基类将copy赋值函数声明为private的,那么编译器会拒绝为派生类生成一个copy赋值函数,因为编译器需要权限去处理基类的成分(在编译时,编译器会假设copy赋值函数需要处理基类的成分)。

提醒

  • 编译器会暗自创建构造函数、析构函数、拷贝构造函数和拷贝赋值函数;