Effective C++ 读书笔记 条款05:了解C++默默编写并调用哪些函数

Core List

1. C++ 默认编写的函数

(1) default 构造函数

(2) 析构函数

(3) copy 构造函数

(4) copy assigment 函数


class Empty {}; 等价于如下:

class Empty {

public:

    Empty() {...}

    ~Empty() {...}

    Empty(const Empty& rhs) {...}

    Empty& operator=(const Empty& rhs) {...}

}

注:这些函数唯有当被调用时,它们才会被编译器创建出来。

调用如下:

Empty e1;    // default 构造函数,析构函数

Empty e2(e1);    // copy 构造函数

Empty e3 = e1;    // copy assigment 函数

PS:

a. 编译器默认产生的析构函数是non-virtual, 除非这个类的基类的析构函数是 virtual, 则该类的默认析构函数才能是 virtual。

b. 默认拷贝构造函数和赋值构造函数都是将来源对象的每一个非静态成员拷贝给了目标对象。

c. 默认构造函数将对象的每一个非静态成员初始化为改类型的默认值。(如果成员也是一个类的对象,则调用该类的构造函数)。

d. 如果自己定义了一个构造函数,则编译器就不会再产生一个默认无参的构造函数,如果希望存在一个无参的构造函数,需要自己定义。


2. 类中存在 const 或引用型的成员变量,拷贝构造函数和赋值构造函数都不能被调用

class NameObject {

public:

    NameObject(string& name, const T& value);

private:

    string& nameValue;

    const T objectValue;


NameObject<int> s("Satch", 2);

NameObject<int> p("Persephone", 36);

p = s; 

注:

a. p.nameValue 和 s.nameValue 分别指向各自的 string 对象,赋值结果希望 p.nameValue 指向 s.nameValue  指向的 string 对象,违背 “引用不可改变指向对象”。

b. const 成员变量同理。

你可能感兴趣的:(Effective C++ 读书笔记 条款05:了解C++默默编写并调用哪些函数)