博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.拷贝控制操作(三/五法则)
阅读量:5081 次
发布时间:2019-06-12

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

 

当定义一个类时,我们显式地或隐式地指定了此类型的对象在拷贝、赋值和销毁时做什么。一个类通过定义三种特殊的成员函数来控制这些操作,分别是拷贝构造函数赋值运算符析构函数

拷贝构造函数定义了当用同类型的另一个对象初始化新对象时做什么,赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么,析构函数定义了此类型的对象销毁时做什么。我们将这些操作称为拷贝控制操作

由于拷贝控制操作是由三个特殊的成员函数来完成的,所以我们称此为“C++三法则”。在较新的 C++11 标准中,为了支持移动语义,又增加了移动构造函数和移动赋值运算符,这样共有五个特殊的成员函数,所以又称为“C++五法则”。也就是说,“三法则”是针对较旧的 C++89 标准说的,“五法则”是针对较新的 C++11 标准说的。为了统一称呼,后来人们干把它叫做“C++ 三/五法则”。

例:

#include 
#include
using namespace std;//变长数组类class Array{public: Array(int len); Array(const Array &arr); //拷贝构造函数 ~Array(); // 析构函数public: int operator[](int i) const { return m_p[i]; } //获取元素(读取) int &operator[](int i){ return m_p[i]; } //获取元素(写入) Array & operator=(const Array &arr); //重载赋值运算符 int length() const { return m_len; }private: int m_len; int *m_p;};Array::Array(int len): m_len(len){ m_p = (int*)calloc( len, sizeof(int) );}Array::Array(const Array &arr){ //拷贝构造函数 this->m_len = arr.m_len; this->m_p = (int*)calloc( this->m_len, sizeof(int) ); memcpy( this->m_p, arr.m_p, m_len * sizeof(int) );}Array::~Array(){ free(m_p); }Array &Array::operator=(const Array &arr){ //重载赋值运算符 if( this != &arr){ //判断是否是给自己赋值 this->m_len = arr.m_len; free(this->m_p); //释放原来的内存 this->m_p = (int*)calloc( this->m_len, sizeof(int) ); memcpy( this->m_p, arr.m_p, m_len * sizeof(int) ); } return *this;}//打印数组元素void printArray(const Array &arr){ int len = arr.length(); for(int i=0; i

运行结果:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

0, 1, 2, 3, 4
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
0, 1, 2, 3, 4, 5, 6, 7, 8, 9

 

转载于:https://www.cnblogs.com/yongdaimi/p/7121151.html

你可能感兴趣的文章
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
Java程序IP v6与IP v4的设置
查看>>