您的位置:首页 > 编程语言 > C语言/C++

C++中直接拒绝编译器自动生成copy constructor和copy operator=操作(6)---《Effective C++》

2017-07-18 16:30 375 查看
我们知道,当我们调用拷贝函数或者拷贝赋值运算符的时候,编译器会自动生成copy constructor和copy operator=操作,如果我们不想让编译其为我们生成这些函数,怎么破?当然就该明确拒绝掉,具体采用什么方法呢?

1)将copy构造函数和copy 赋值操作符声明为private,籍由明确声明一个成员函数,这样可以阻止编译器暗自创建其专属版本;而将这些函数声明为private,你可以成功阻止别人调用它,岂不是一举多得呀!

class A{
public:
A();
...
private:
int x;
int y;
//注意声明中参数名称不一定需要,只是大家习惯写了而已
A(const A&);
A& operator=(const A&);
}


2)上述方法适用于大多数场合,但是如果此时我们使用member成员函数或者friend函数或者friend类呢?这就很尴尬了哈!那么为了应该对这种极少数的情况,我们应该怎样解决呢?不怕,兵来将挡,水来土掩,当然有解决办法啦!答案就是为不想被编译器自动生成c
4000
opy构造函数和copy赋值运算符的类B创建基类A,这样即使B的member成员函数或者B的友元函数或者友元类来调用的时候,编译器也会拒绝为B创建上述函数,我们可以从如下代码中加以了解:

#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class A{
public:
A();
A(int x) :x(x){
};
private:
int x;
A(const A&);
A& operator=(const A&);
};
class B :public A{
public:
B(int x, int y) :A(x){
this->y = y;
}
B createTempB(B b){
B temp = b;
return temp;
}
void show(){
cout << y << endl;
}
private:
int y;
};
int main(){
B b(1, 10);
return 0;
}


猜猜这样会发生什么问题呢?我们在保存的时候其实就可以在class B:public A&底下看到A底下有一个红色下划线,放上面可以看到提示错误为:A(const A&)为不可访问,这下我们就可以较为全面的解决这个问题啦!!!

最后,我想说一下,C++的路程漫漫且枯燥,且是一片荆棘遍布的雷区,希望大家可以沉下性子漫漫探索钻研,生活在于有节制有计划的追寻自己想要的,明确了自己的目标之后生活会变得特别奇妙,希望大家都可以找到自己想要的,我们,在路上!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐