C++中重载赋值运算符=

news/2024/10/17 12:20:34/

C++中重载赋值运算符=

拷贝赋值和移动赋值运算符可以把类的一个对象赋值给该类的另一个对象。此外,类还可以定义其他赋值运算符以使用别的类型作为右侧

运算对象。

举个例子,在拷贝赋值和移动赋值运算符之外,标准库 vector 类还定义了第三种赋值运算符,该运算符接受花括号内的元素列表作为参数。我们能以如下的形式使用该运算符:

vector<string> v;
v = {"a", "an", "the"};

同样,也可以把这个运算符添加到 strVec 类中

class StrVec {  
public:StrVec &operator=(std::initializer_list<std::string>);//其他成员省略
};

为了与内置类型的赋值运算符保持一致(也与我们已经定义的拷贝赋值和移动赋值运算致),这个新的赋值运算符将返回其左侧运算对象

的引用:

StrVec &StrVec::operator=(initializer_list<string> il)
{// alloc_n_copy 分配内存空间并从给定范围内拷贝元素auto data = alloc_n_copy(il.begin(), il.end());free();                 //销毁对象中的元素并释放内存空间elements= data.first;   //更新数据成员使其指向新空间first_free = cap = data.second;return *this;
}

和拷贝赋值及移动赋值运算符一样,其他重载的赋值运算符也必须先释放当前内存空间再创建一片新空间。不同之处是,这个运算符无须

检查对象向自身的赋值,这是因为它的形参 initializer list<string> 确保 ilthis 所指的不是同一个对象。

我们可以重载赋值运算符。不论形参的类型是什么,赋值运算符都必须定义为成员函数。

复合赋值运算符

复合赋值运算符不非得是类的成员,不过我们还是倾向于把包括复合赋值在内的所有赋值运算都定义在类的内部。为了与内置类型的复合

赋值保持一致,类中的复合赋值运算符也要返回其左侧运算对象的引用。例如,下面是 Sales_data 类中复合赋值运算符的定义:

//作为成员的二元运算符:左侧运算对象绑定到隐式的 this 指针
//假定两个对象表示的是同一本书
Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{units_sold += rhs.units_sold;revenue += rhs.revenue;return *this;
}
赋值运算符必须定义成类的成员,复合赋值运算符通常情况下也应该这样做这两类运算符都应该返回左侧运算对象的引用。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器


http://www.ppmy.cn/news/802484.html

相关文章

盘点全球8K视频直播的解决方案和成果

8K是什么?简单来说&#xff0c;8K就是更加清晰的视觉体验&#xff0c;8K分辨率高达7680*4320像素&#xff0c;是4K分辨率的4倍&#xff0c;很多公司早就已经开始布局研发8K产品和技术了&#xff0c;就众视媒体小编ZL了解所得&#xff0c;早在2013年CES展会上&#xff0c;夏普就…

三星QLED 8K电视Q950TS的方法论:左手设计,右手技术

量价齐跌&#xff0c;可能是电视行业在过去几年中留给外界最深刻的印象。 随着近些年消费者的注意力逐渐被新媒介形式吸引&#xff0c;传统内容的传播载体也在随之改变&#xff0c;原有的载体无可避免地成了被取代的对象&#xff0c;这样的论调在电视市场似乎得到了验证。 在…

盘点博冠8K 2021年度大事件,8K走进生活成事实

2021年&#xff0c;是中国8K元年。中央广播电视总台8K超高清电视频道试验开播、我国首次启动央视8K春晚直播、B站宣布迈入8K超高清时代...... 这一年&#xff0c;也是博冠8K不同寻常的一年。回首这一年&#xff0c;博冠8K依旧步履铿锵&#xff0c;以创新奋楫争先&#xff0c;以…

三星Neo QLED 8K 2022款评测 怎么样

三星Neo QLED 8K电视采用旗下最新量子矩阵技术Pro显示系统&#xff0c;凭借量子点矩阵技术能够对密集排列的LED进行超精细和精准的控制&#xff0c;可最大程度防止光晕的产生&#xff0c;使画面显示更加纯净、清晰。 三星表示&#xff0c;Neo QLED 8K电视较之常规量子点矩阵技术…

Sentinel组件限流降级

官网: home | Sentinel 文档不是很全, 关于nacos的配置中心的使用完全没有 常见的限流算法 静态窗口限流: 即规定1秒内只能固定处理多少请求动态窗口限流: 同样是规定1秒内处理多少请求, 但是统计方式与第一个不同, 比如2.5秒则是统计1.5秒到现在的请求数漏桶限流: 进来可以…

linux搭建vsftpd服务使用filezilla连接服务

背景&#xff1a;支持使用filezilla上传文件到公司的服务机器上&#xff0c;所以搭建vsftpd支持filezilla进行上传 一、linux机器搭建vsftpd服务 1、先看看自己的机器属于什么发行版&#xff0c;不同的发行版命令不一样 我的是centos&#xff0c;其他发行版命令不一样&#xf…

Mysql同步到ES时date和time字段类型转换问题解决办法

这个问题中发生问题的es字段映射类型为date类型&#xff01;&#xff01;&#xff01; 字符串类型的会好很多&#xff0c;关键我这边是通过logstash生成索引&#xff0c;并且全量同步的&#xff0c;不好改索引类型&#xff01;&#xff01;&#xff01; 问题描述&#xff1a; …

VSCode控制台乱码解决

如果你试过很多方法依然解决不了乱码问题&#xff0c;不妨试试这个 设置完成后重启电脑 开机后查看一下当前的编码 打开VSCode试一下 不得不吐槽一下MS。。。。。。