《Effective C++》读后总结(五)了解C++默默编写并调用哪些函数

空类
对于一个空类,编译器就会为它声明一个default(默认)构造函数,copy(复制)构造函数,一个copy assignement(复制赋值)操作符和一个析构函数。惟有这些函数被调用,它们才被编译器创建出来。如下所示:

class Empty() {};
//等效于
class Empty{
public:
    Empty() {...}   //defualt构造函数
    Empty(const Empty & rhs){...} //copy构造函数
    ~Empty(){....} //析构函数
    Empty &operator=(const Empty & rhs){...} copy assignement copy操作符
};

对于copy构造函数和copy assignment操作符,编译器创建的版本只是单纯地将来源对象的每一个non-static成员变量拷贝到目标对象。

覆盖

template
class NameObject{
public:
    NameObject(const char *name, const T& value);
    NameObject(const string &name, const T& value);
    .....
private:
    string nameValue;
    T objectValue;
}

由于其中声明了一个构造函数,编译器就不会再为它创建defualt构造函数。由NamedObject既没有声明copy构造函数,也没有声明copy assigement操作符,所以编译器会为它创建那些函数。但仅仅局限于代码合法且有适当机会证明它有意义。如一下代买

template
class NameObject{
public:
    NameObject(string &name, const T& value);
    .....
private:
    string & nameValue;
    const T objectValue;
}

其中C++并不允许让“引用改变所指的对象”,以及更改const成员变量,因此编译器在编译复制构造函数时会报错,停止编译

你可能感兴趣的:(effective,C++)