跳转至

📔 第三章 构造、析构、赋值 读书笔记

T5. Know what functions C++ silently writes and calls

如果未声明任何构造函数,编译器会为其声明一个 default构造函数

一般会自动生成 copy构造函数copy赋值操作符析构函数

所有的函数都是 public 且 inline。 例如:

class Empty{...}
等价于
1
2
3
4
5
6
7
8
class Empty{
public:
    Empty(){...} //default构造函数
    Empty(const Empty& rhs){...} //copy构造函数
    ~Empty(){...} //析构函数

    Empty& operator = (const Empty& rhs){...} //copy赋值操作符
};
当函数被调用时,三个函数才会被编译器创建。

编译器产生的析构函数是 non-virtual,除非这个类(class)基类(base class)自身声明中有 virtual 析构函数

对于编译器生成的 copy构造函数copy 赋值操作符,只是简单地将源对象中的每一个non-static成员变量拷贝到目标对象中。

5.1 总结

编译器会暗自为 class 创建 default构造函数、copy构造函数、copy assignment操作符以及析构函数

T6. 若不想使用编译器自动生成的函数,则明确拒绝

在T5中介绍,如果不声明 copy构造函数copy赋值操作符函数,则编译器会在被调用时自动生成。

为了解决自动生成的方法:主动对函数进行声明为private。【做法不是绝对安全】

1
2
3
4
5
6
7
8
class HomeForSale{
     public:
        ...
     private:
        ...
         HomeForSale(const HomeForSale&);
        HomeForSale& operator=(const HomeForSale&);
 };

另外一种方法:通过设计一个基类来继承,从而减少代码的重复。

1
2
3
4
5
6
7
8
9
class Uncopyable{
protected:
    Uncopyable(){}
    ~Uncopyable(){}

private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
};

缺点:会出现多重继承。

在boost库中提供 noncopyable 函数。

总结:为驳回编译器自动(暗自)提供的机能,将相应的 成员函数声明为 private 并且不予实现