当前位置: 首页 > news >正文

汕头网站设计开发专业网站空间买什么的好

汕头网站设计开发专业,网站空间买什么的好,邯郸购物网站建设,网站建设上海网站建设拷贝交换技术(copy and swap)是什么,网上估计能查到很多。但网上有点难找到完整的演示代码,所以这里记录一下。难点在于: 如果要满足 5 的原则,我到底要写那些函数? 默认构造函数、复制构造函数…

拷贝交换技术(copy and swap)是什么,网上估计能查到很多。但网上有点难找到完整的演示代码,所以这里记录一下。难点在于:

  1. 如果要满足 5 的原则,我到底要写那些函数?
    默认构造函数、复制构造函数、析构函数、swap 函数。剩下三个函数是固定模板(boilerplate),不用写与类相关的代码。由于两种重载赋值运算符合并成一个了,所以只剩两个函数需要写固定模板。
  2. 哪些是 noexcept 的?
    必须是 noexcept 的函数:移动构造函数,重载赋值运算符(注意只剩一个了),交换函数。
  3. 交换函数和 std::swap 的关系如何?
    必须自己写一个属于这个类的交换函数,在实现拷贝交换技术时不能调用 std::swap。在类外面,可以通过 using std::swap; 的方法,让编译器优先选用自己实现 swap 函数,如不存在,再回退到 std::swap;在类外面也可以直接都用 std::swap,无所谓。
#include <cassert> // assert
#include <utility> // swapclass Demo {using Self = Demo;public:int ichi{}; // Note 1: 这里初始化为 0,又在默认构造函数初始化为 1,是为了说明委托默认构造函数的作用。特别地,如果存在成员没有用大括号初始化,就更需要委托默认构造函数完成所有成员的初始化。// 要么为 nullptr,要么为大小为 1 的数组。int* ein{};public:// Note 2: 默认构造函数是否是 constexpr, noexcept 的,视实际情况而定。constexpr Demo() noexcept : ichi{ 1 }, ein{ nullptr } {}// Note 3: 复制构造函数通常涉及内存分配,一般不是 noexcept 的。Demo(const Self& other) : Demo() { // Note 4: 需要委托默认构造函数,见 Note 1。不委托无法通过 assert。assert(ichi == 1);assert(ein == nullptr);ichi = other.ichi;if (other.ein) {ein = new int[ichi] { other.ein[0] };}}// Note 5: 使用拷贝交换技术,需要实现 swap 的函数。// Note 6: swap 函数应当是 noexcept 的。friend void swap(Self& a, Self& b) noexcept {// Note 7: 交换成员对象时,可以优先使用类型自己定义的友元函数 swap,不存在才回退到 std::swap。using std::swap;swap(a.ichi, b.ichi);swap(a.ein, b.ein);}// Note 8: 移动构造函数应当是 noexcept 的。Demo(Self&& other) noexcept : Demo() { // Note 9: 需要委托默认构造函数,见 Note 1。不委托无法通过 assert。assert(ichi = 1);assert(ein == nullptr);swap(*this, other); // Note 10: 使用拷贝交换技术时,必须使用自己定义的友元函数,绝不要使用 std::swap。}// Note 11: 重载赋值运算符可以只写一个,且应当是 noexcept 的。异常在复制构造函数中发生,不在赋值运算符中发生。Self& operator=(Self other) noexcept {swap(*this, other); // Note 12: 使用拷贝交换技术时,必须使用自己定义的友元函数,绝不要使用 std::swap。return *this;}// Note 13: 析构函数是否是 constexpr 的,视情况而定。constexpr ~Demo() { // Note 14: 析构函数默认总是 noexcept 的,不写。if (ein) {delete[] ein;}}
};int main() {// 测试 constexpr 默认构造。constexpr Demo default_obj;static_assert(default_obj.ichi == 1);// 测试默认构造。Demo allocated_obj;allocated_obj.ein = new int[1] { 114514 };{// 测试复制构造。Demo test_copy_constructor = allocated_obj;assert(test_copy_constructor.ein[0] == 114514);assert(allocated_obj.ein[0] == 114514);// 测试移动构造。Demo test_move_constructor = std::move(test_copy_constructor);assert(test_move_constructor.ein[0] == 114514);assert(test_copy_constructor.ein == nullptr);}{// 测试复制赋值。Demo test_copy_assignment;test_copy_assignment = allocated_obj;assert(allocated_obj.ein[0] == 114514);// 测试移动赋值。Demo test_move_assignment;test_move_assignment = std::move(test_copy_assignment);assert(test_move_assignment.ein[0] == 114514);assert(test_copy_assignment.ein == nullptr);}
}
http://www.yayakq.cn/news/348863/

相关文章:

  • 国内漂亮大气的网站网站提交地址
  • 顺义手机网站设计番禺人才网单位招考
  • 杭州酒店网站建设net网站开发微信支付
  • 网站未备案怎么访问保定哪里有做网站的
  • 哪里有建站代理加盟镇江网站建设策划
  • 选服务好的网站建设公司免费的分销小程序
  • 诚一网站推广成都网站制作哪家好
  • 做淘宝客网站好搭建吗有什么网站可以接活做设计
  • 嘉兴专业网站排名推广个体户 网站建设
  • 建设网站怎么提需求郑州网站制作公
  • 网站设计方面有什么公司新手seo入门教程
  • 企业网站注销流程卖域名做非法网站
  • 手机建公司网站摄影工作室网页设计
  • 济南城乡建设网站成色好的y31s标准版下载
  • cn免费域名注册网站帝国cms更改网站ico
  • 化工网站开发如何给公司做一个网站
  • 做网站开发需要学哪些东西梧州论坛组织参观活动
  • 营口网站建设开发制作做违法网站会怎么样
  • 个人网站建站网架公司股价
  • 网站公司 转型电子商务网站建设和推广论文
  • ui设计师怎么做简历网站宣传推广文案
  • 适用于个人网站的域名手机ps网页版在线制作
  • 我是做装修什么网站可以百度推广引流
  • 网站建设方案报价网站建设中 单页
  • 辛集哪做网站做问卷调查赚钱的网站
  • 网站默认图片素材深圳网站设计深圳网站建设
  • 赤峰浩诚网站建设有限公司wordpress漫画商城
  • 网站路径网页程序开发学什么语言
  • 商务网站设计实训报告境外注册网站
  • 石家庄网站建设成功案例微信开放平台开发者