标签:virtual 比较 const 赋值运算 strong 成员函数 sig 注意 多个
class Empty {};
// 就像写下这样的代码
class Empty{
public:
Empty() {...} // default 构造函数
Empty(const Empty& rhs) {...} // copy构造函数
~Empty() {...} // 析构函数,是否该是virtual稍后说明
Empty& operator=(const Empty& rhs) {...} // copy assignment 操作符
};
// 编译器餐厨的析构函数是一个non-virtual,除非这个class的base class自身声明有virtual析构函数.
// 这种情况下这个函数的虚属性;virtualness;主要来自base class.
将成员函数声明为private而且故意不实现他们
class HomeForSale{
public:
...
private:
...
HomeForSale(const HomeForSale&); // 只是声明
HomeForSale& operator=(const HomeForSale&);
};
// 没有写函数参数的名称,参数名称并非必要,这个函数毕竟不会被实现出来,也很少被使用,没必要指定参数名称.
将连接期错误移至编译期是可能的(而且是好事,毕竟越早侦测出错误越好),只要将copy构造函数和copy assignment 操作符声明为private就可以办到,但不是在HomeForSale自身,而是在一个专门为了阻止coping动作而设计的base class内.
class Uncopyable{
protected: // 允许derived对象构造和析构
Uncopyable() {}
~Uncopyable() {}
private: // 阻止copying
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
// 为求阻止HomeForSale对象被拷贝,我们唯一需要做的就是Uncopyable:
class HomeForSale: private Uncopyable{
...
};
// 只要任何人--甚至是member函数或friend函数--尝试拷贝HomeForSale对象,编译器便试着生成一个copy构造函数和一个copy assignment操作符.这些函数的"编译器生成版"会尝试调用其base class的对应兄弟,那些调用会被编译器拒绝,应为其base class 的拷贝函数是private.
copying 函数应该确保复制"对象内的所有成员变量"及所有base class成分.
不要尝试以某个copying函数实现另一个copying函数.应该将共同机能放进第三个函数中,并由两个copying函数共同调用.
标签:virtual 比较 const 赋值运算 strong 成员函数 sig 注意 多个
原文地址:https://www.cnblogs.com/o-v-o/p/10161073.html