C++为什么要保持默认操作的一贯性

这篇文章主要介绍“C++为什么要保持默认操作的一贯性”,在日常操作中,相信很多人在C++为什么要保持默认操作的一贯性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++为什么要保持默认操作的一贯性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

C.22: 保持默认操作的一贯性

Reason(原因)

默认操作从概念上讲是配合严密的一整套处理。它们的语义是相互关联的。如果拷贝/移动构造和拷贝/移动赋值做的是逻辑上不同的事情,用户会感到诧异;如果构造函数和析构函数没有为资源管理提供一致的想法,用户会感到诧异;如果拷贝和移动操作没有对应构造函数和析构函数的动作,用户会感到诧异。

Example, bad(反面示例)
class Silly {   // BAD: Inconsistent copy operations
   class Impl {
       // ...
   };
   shared_ptr<Impl> p;
public:
   Silly(const Silly& a) : p{a.p} { *p = *a.p; }   // deep copy
   Silly& operator=(const Silly& a) { p = a.p; }   // shallow copy
   // ...
};

这些操作(拷贝构造和赋值)关于拷贝的语义不同(风别是深拷贝和浅拷贝)。这会导致困惑和错误。

Enforcement(实施建议)

<ul class=">

  • (复杂) 拷贝/移动构造函数和对应的拷贝/移动赋值运算符应该以同样的的解引用级别写入同样的成员变量。

  • (复杂)在拷贝/移动构造函数中写入的任何成员变量也应该被其他的构造函数初始化。

  • (复杂)如果拷贝/移动构造函数对成员变量进行深拷贝,那么析构函数应该修改该成员变量。

  • (复杂)如果析构函数修改某个成员变量,那么这个成员变量应该在拷贝/移动构造函数或者赋值运算符中被写入。

到此,关于“C++为什么要保持默认操作的一贯性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注蜗牛博客网站,小编会继续努力为大家带来更多实用的文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram