(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; //引用型成员变量,必须在每个构造函数手动初始化 };
禁止被拷贝构造或赋值构造的做法:
(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); };
原文:https://www.cnblogs.com/quehualin/p/9209074.html