本博文以及这个系列的都是我本人观看《Effective C++》的观后感,每天学习一个改善自己C++的一个小技巧。
条款06:若不想使用编译器自动生成的函数,就应该明确地拒绝。
上一篇博文提到,如果你没有声明编译器会为你声明默认构造函数、析构函数、赋值操作、拷贝构造函数。
某些情况下你希望你产生地对象独一无二,不想给别人赋值与拷贝;你可以这样做
class MySelt
{
public:
MySelt() {
//..
}
~MySelt() {
//..
}
private: //将拷贝其构造函数和赋值函数声明为private。
//...
MySelt(const MySelt&) {
//...
}
MySelt& operator= (const MySelt&)
{
//...
}
};
但这并不是最佳做法,因为其成员函数和友元函数(friend)还是可以访问它得拷贝和赋值函数。
最佳做法如下:
class MySeltBase {
protected:
MySeltBase(){
//...
}
~MySeltBase() {
//...
}
private:
MySeltBase(const MySeltBase&) {
//...
}
MySeltBase& operator= (const MySeltBase&) {
//..
}
};
class MySeltDerive:private MySeltBase {
//...
};
int main()
{
MySeltDerive msd;
//MySeltDerive msd1(msd); //报错,无法拷贝
//MySeltDerive msd2 = msd; //报错,无法赋值
}
MySeltDerive这个类不再声明拷贝构造和赋值操作函数。
记住
为了应对编译器自动提供函数的机能,可将相应的成员函数声明为private并且不给予实现。使用像上面的做法一样。