Effective C++ 笔记(2)构造/析构/赋值运算

05、了解C++默默编写并调用哪些函数

  (1)、默认构造函数

Empty(){...} //调用父类构造函数,non-static成员变量构造函数,不会默认初始化内置类型

  (2)、析构函数

~Empty(){...} //调用父类析构函数,non-static成员变量析构函数

  (3)、拷贝构造函数

Empty(const Empty& rhs){...} //单纯地将来源对象的每一个non-static变量拷贝到目标对象

  (4)、赋值构造函数

Empty& operator=(const Empty& rhs){...} //单纯地将来源对象的每一个non-static变量拷贝到目标对象

  类内有引用、const、及父类的拷贝构造函数,赋值构造函数为private时,编译器会拒绝生成这一类函数。换言之,如果类内有引用、const成员变量,或者其父类的相关函数不可访问时,必须手动生成。

class Empty:
{
public:
    Empty(){...}
    Empty(const Empty& rhs){...}
    ~Empty(){...}
    
    Empty& operator=(const Empty& rhs){...}
private:
    const int m_cInt; //只读成员变量
    int &ref; //引用型成员变量,必须在每个构造函数手动初始化
};

  

06、若不想使用编译器自动生成的函数,就该明确拒绝

禁止被拷贝构造或赋值构造的做法:

  (1)、将相应成员函数声明为private且不去实现它。(链接期出错

class HomeForSale
{
public:
    HomeForSale();
    ~HomeForSale();
private:
    HomeForSale(const HomeForSale& rhs);    //只有声明
    HomeForSale& operator=(const HomeForSale& rhs);    
};

  (2)、private继承Uncopyable类(编译期出错)

class Uncopyable
{
public:
    Uncopyable(){};
    ~Uncopyable(){};
private:
    Uncopyable(const Uncopyable& rhs);
    Uncopyable& operator=(const Uncopyable& rhs);
};

  

猜你喜欢

转载自www.cnblogs.com/quehualin/p/9209074.html