C++中直接拒绝编译器自动生成copy constructor和copy operator=操作(6)---《Effective C++》
2017-07-18 16:30
375 查看
我们知道,当我们调用拷贝函数或者拷贝赋值运算符的时候,编译器会自动生成copy constructor和copy operator=操作,如果我们不想让编译其为我们生成这些函数,怎么破?当然就该明确拒绝掉,具体采用什么方法呢?
1)将copy构造函数和copy 赋值操作符声明为private,籍由明确声明一个成员函数,这样可以阻止编译器暗自创建其专属版本;而将这些函数声明为private,你可以成功阻止别人调用它,岂不是一举多得呀!
2)上述方法适用于大多数场合,但是如果此时我们使用member成员函数或者friend函数或者friend类呢?这就很尴尬了哈!那么为了应该对这种极少数的情况,我们应该怎样解决呢?不怕,兵来将挡,水来土掩,当然有解决办法啦!答案就是为不想被编译器自动生成c
4000
opy构造函数和copy赋值运算符的类B创建基类A,这样即使B的member成员函数或者B的友元函数或者友元类来调用的时候,编译器也会拒绝为B创建上述函数,我们可以从如下代码中加以了解:
猜猜这样会发生什么问题呢?我们在保存的时候其实就可以在class B:public A&底下看到A底下有一个红色下划线,放上面可以看到提示错误为:A(const A&)为不可访问,这下我们就可以较为全面的解决这个问题啦!!!
最后,我想说一下,C++的路程漫漫且枯燥,且是一片荆棘遍布的雷区,希望大家可以沉下性子漫漫探索钻研,生活在于有节制有计划的追寻自己想要的,明确了自己的目标之后生活会变得特别奇妙,希望大家都可以找到自己想要的,我们,在路上!!!
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++的路程漫漫且枯燥,且是一片荆棘遍布的雷区,希望大家可以沉下性子漫漫探索钻研,生活在于有节制有计划的追寻自己想要的,明确了自己的目标之后生活会变得特别奇妙,希望大家都可以找到自己想要的,我们,在路上!!!
相关文章推荐
- C++中拒绝编译器自动生成copy构造函数和copy赋值运算符操作(6)---《Effective C++》
- Effective C++ Item 06-若不想编译器自动生成的函数,就该明确拒绝
- effect C++ 若不想使用编译器自动生成的函数,就该拒绝
- Effective C++ 条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ Item 6 若不想使用编译器自动生成的函数,就该明确拒绝
- 读书笔记《Effective C++》条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ 06 若不想使用编译器自动生成函数,就该明确拒绝 笔记
- effective c++若不想使用编译器自动生成的函数,就应该明确拒绝
- Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ Item 6 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- 读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝
- C++ 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++之 拒绝编译器自动生成函数
- Effective C++——》条款6:若不想使用编译器自动生成函数,就该明确拒绝 .
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
- effective C++ 06_若不想使用编译器自动生成的函数,就该明确拒绝 读书笔记
- 《Effective C++》学习笔记条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- 读书笔记《Effective c++》 条款06 若不想使用编译器自动生成的函数,就应该明确拒绝
- Effective C++ 第五 六条C++默认编写调用哪些函数,如何明确拒绝自动生成的函数