C++语言构造参考

本文详细介绍了C++中的赋值运算符,包括复制赋值与移动赋值的规范,以及复制并交换的策略。接着讨论了流的提取与插入运算符,函数调用运算符的使用,自增自减运算符的实现,以及二元算术和关系运算符的重载方法。文章强调了运算符重载在保持代码对称性和提供强异常保证方面的重要性。
摘要由CSDN通过智能技术生成

赋值运算符

        赋值运算符(operator=)有特殊性质:  细节见复制赋值移动赋值

对规范的复制赋值运算符,  期待其在自赋值时不进行操作,  并按引用返回  lhs:

1 . // 假设对象保有可重用存储,  例如一个分配于堆的缓冲区  mArray
2 . T& operator=(const T& other) // 复制赋值
3 . {
4 .     if (this != &other) { // 期待检查自赋值
5 .         if (other .size != size) {         // 存储不可复用
6 .             delete[] mArray;              // 销毁  this 中的存储
7 .             size = 0;
8 .             mArray = nullptr;             // 在下一行抛出的情况下维持不变式
9 .             mArray = new int[other .size]; // 分配  this 中的存储
10 .             size = other .size;
11 .         }
12 .         std::copy(other .mArray, other .mArray + other .size, mArray);
13 .     }
14 .     return *this;
15 . }

        对规范的移动赋值,  期待其(即有完好类不变式的状态),  且在自赋值时要么不做任何 事,  要么至少遗留对象于合法状态,  并以非  const 引用返回  lhs,  而且为  noexcept:

1 . T& operator=(T&& other) noexcept // 移动赋值
2 . {
3 .     if(this != &other) { // 自赋值时无操作  (delete[]/size=0 亦  OK)
4 .         delete[] mArray;                               // 删除此存储
5 .         mArray = std::exchange(other .mArray, nullptr); // 令被移动对象遗留于合法状态
6 .         size = std::exchange(other .size, 0);
7 .     }
8 .     return *this;
9 . }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值