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

我们知道,当我们调用拷贝函数或者拷贝赋值运算符的时候,编译器会自动生成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类呢?这就很尴尬了哈!那么为了应该对这种极少数的情况,我们应该怎样解决呢?不怕,兵来将挡,水来土掩,当然有解决办法啦!答案就是为不想被编译器自动生成copy构造函数和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++的路程漫漫且枯燥,且是一片荆棘遍布的雷区,希望大家可以沉下性子漫漫探索钻研,生活在于有节制有计划的追寻自己想要的,明确了自己的目标之后生活会变得特别奇妙,希望大家都可以找到自己想要的,我们,在路上!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值