博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BOOST】boost : : noncopyable 分析,拷贝构造、赋值函数
阅读量:4211 次
发布时间:2019-05-26

本文共 1983 字,大约阅读时间需要 6 分钟。

继承noncopyable的类不能 通过拷贝构造和赋值函数操作来初始化对象;

like this:

有一个类:AA AA aa;  //OK//1. 拷贝构造AA bb(aa); // NO//2. 赋值函数AA cc; cc = aa ;// NO

一个类的有4个基础函数:

构造函数
赋值函数
析构函数
复制构造函数

class noncopyable的基本思想是把构造函数析构函数设置protected权限,这样子类可以调用,但是外面的类不能调用。那么当子类需要定义构造函数的时候不至于通不过编译。
但是最关键的是noncopyable把拷贝构造和复制赋值函数做成了private,这就意味着除非子类定义自己的copy构造和赋值函数,否则在子类没有定义的情况下,外面的调用者是不能够通过赋值和copy构造等手段来产生一个新的子类对象的。

BOOST中的源码(有删减)

namespace noncopyable_  // protection from unintended AD{  class noncopyable  {  protected:      noncopyable() {}      ~noncopyable() {}  private:  // emphasize the following members are private      noncopyable( const noncopyable& );      noncopyable& operator=( const noncopyable& );  };}typedef noncopyable_::noncopyable noncopyable;

测试类BB

class BB :public noncopyable{public:    BB()     {        cout << "BB" << endl;    }}

此时在主函数中使用:

BB aa;//1. 拷贝构造BB bb(aa);

报错:

错误1:error C2248: “noncopyable_::noncopyable::noncopyable”: 无法访问 private 成员(在“noncopyable_::noncopyable”类中声明)  ...

我们使用了拷贝构造,但是BB没有自己的拷贝构造但是爸爸有。所以找爸爸,但是爸爸又不让用!所以出错了~

赋值函数的错误同理

//2. 赋值构造BB cc;cc = aa;

报错:

错误  1   error C2248: “noncopyable_::noncopyable::operator =”: 无法访问 private 成员(在“noncopyable_::noncopyable”类中声明)  ...

怎么才能使用拷贝构造和赋值函数呢? 自己有!!!

正所谓东西再好都是被人的,别人有不如自己有。

我们给BB加上自己的拷贝构造和赋值函数。

为了方便演示,添加一个变量、有参构造、拷贝构造。怕太乱就不写赋值函数了;

***********************************完整的BB*********************************************

class BB :public noncopyable{public:    BB(int n):member(n)     {           cout << "BB" << endl;       }    BB(const BB& b)    {          this->member = b.member;        cout << "拷贝构造:memeber =  " << member << endl;    }private:    int member;};

***********************************完整的BB 结束***********************************

int main(){    //声明一个对像aa调用构造函数, 此时aa.member = 88;    BB aa(88);    //bb调用拷贝构造,将aa.member 给了 bb, 此时bb.member 也是 88    BB bb(aa);     return 0;}

显示结果:

这里写图片描述

赋值函数同上,就不再赘述了。

由一个简单的 noncopyable 写了这么多。
其实就2个核心问题:
1. 类的三个保护访问级别(public、protected、private )和 继承的后的访问级别的问题;
2. 构造、拷贝构造、赋值函数的调用问题,什么时候调用谁;

你可能感兴趣的文章
【心灵鸡汤】Give it five minutes不要让一个好主意随风而去
查看>>
【React Native】Invariant Violation: Application AwesomeProject has not been registered
查看>>
【ReactNative】真机上无法调试 could not connect to development server
查看>>
【XCode 4.6】常用快捷键 特别是格式化代码ctrl+i
查看>>
【iOS游戏开发】icon那点事 之 实际应用(二)
查看>>
【iOS游戏开发】icon那点事 之 图标设计(三)
查看>>
【IOS游戏开发】之测试发布(Distribution)
查看>>
【IOS游戏开发】之IPA破解原理
查看>>
【一天一道LeetCode】#45. Jump Game II
查看>>
【一天一道LeetCode】#46. Permutations
查看>>
【一天一道LeetCode】#47. Permutations II
查看>>
【一天一道LeetCode】#56. Merge Intervals
查看>>
【一天一道LeetCode】#58. Length of Last Word
查看>>
【一天一道LeetCode】#59. Spiral Matrix II
查看>>
【一天一道LeetCode】#30. Substring with Concatenation of All Words
查看>>
【一天一道LeetCode】#60. Permutation Sequence.
查看>>
【一天一道LeetCode】#113. Path Sum II
查看>>
【一天一道LeetCode】#114. Flatten Binary Tree to Linked List
查看>>
【unix网络编程第三版】阅读笔记(二):套接字编程简介
查看>>
【一天一道LeetCode】#115. Distinct Subsequences
查看>>