(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