每天学习一个改善自己C++的一个小技巧之条款06:若不想使用编译器自动生成的函数,就应该明确地拒绝。

本博文以及这个系列的都是我本人观看《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并且不给予实现。使用像上面的做法一样。

猜你喜欢

转载自blog.csdn.net/weixin_50188452/article/details/111241138
今日推荐