若不想使用编译器自动生成的函数,就该明确拒绝

Posted stephen-qin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了若不想使用编译器自动生成的函数,就该明确拒绝相关的知识,希望对你有一定的参考价值。

//有些情况下,想要明确地拒绝对象之间的拷贝,可以采用两种方式:
//方式1: 将拷贝构造函数和赋值操作声明为private,且不去实现
class A
{
private:
    A(const A&);
    A& operator=(const A&);
};

int main()
{
    A a1;    //报错:没有默认的构造函数, 一旦存在自定义的构造函数,即使是copy构造函数,编译器也不再会生成默认构造函数了.
    A a2 = a1;  //报错:拷贝构造函数不可访问.return 0;
}

//方式2: 去继承一个拷贝构造函数和赋值运算符函数为private的基类
class Uncopyable
{
private:
//protected:    //当以下两个函数为非private时,下面Test中操作不会报错.
    Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
protected:
    Uncopyable();
    ~Uncopyable();
};

class B : private Uncopyable
{

};

void Test()
{
    B b1;
    B b2;
    b2 = b1;    //报错:无法引用赋值操作;   这个才是调用的赋值操作符
    B b3 = b1;    //报错:无法引用拷贝构造函数;   注意此时调用的拷贝构造函数
}

 


 

以上是关于若不想使用编译器自动生成的函数,就该明确拒绝的主要内容,如果未能解决你的问题,请参考以下文章

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

条款6:不想使用编译器自动生成的函数,就要明确拒绝!

如果不想使用编译器默认生成的函数,请明确拒绝它!

effective c++学习笔记

第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数

明确拒绝编译器自动生成的函数