条款5:了解C++默默编写并调用哪些函数

编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符
但是c++拒绝编译那一行赋值动作。你不会自动copy assignment操作符 当你打算在一个“内涵reference成员”的class内支持赋值操作 或
内含“const 成员”

意思是当你想给一个具有 引用&成员 或者是 const成员 的对象赋值时,编译器不会自动生成赋值运算符,你只能自己写。

#include <iostream>
#include<string>
using namespace std;
template<class  T>
class  DefaultText
{public:DefaultText(string& name,const T value):string_value(name),cosnt_value(value){}~DefaultText(){}private:string& string_value;const T cosnt_value;
};int main()
{//测试1 c++拒绝含有“&或const”的成员进行赋值操作string newDog("dog");string newCat("cat");DefaultText<int> p(newDog, 2);DefaultText<int> c(newCat, 36);/*p = c;//无法引用函数 "DefaultText<T>::operator=(const DefaultText<int> &) [其中 T=int]" (已隐式声明)--它是已删除的函数   MyCpulsLearn    E : \MyCpulsLearn\MyCpulsLearn\MyCpulsLearn.cpp 92*/return 0;
}

条款6:若不想使用编译器自动生成函数,就该明确拒绝

运用这个机制。
你可以声明

private://阻止编译器 copy构造函数,copy assignment操作符Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&);

条款7:为多态基类声明virtual析构函数

现在有个StringText基类和DerivedString子类
当我们创建一个DerivedString的对象
并用StringText* 类型的s 去接收它的时候
当释放s的时候,他会去调用StringText的析构函数,
但是?理论上我们应该预期是调用 ~ DerivedString()再调用~StringText()
实际上确实先调用~StringText()

解决方案是将基类的析构函数申明为virtual。此后所有子类对象会销毁整个对象。
但是不用滥用virtual,它涉嫌到虚函数表等指针,总之就是会浪费性能,如果不是作为基类使用,或不是为了多态,就不该声明virtual析构函数

#include <iostream>
#include<string>
using namespace std;class StringText
{public:StringText() { cout << " StringText " << endl; }~StringText() { cout << " ~StringText " << endl; }private:};
class StringText1
{public:StringText1() { cout << " StringText1 " << endl; }virtual ~StringText1() { cout << " ~StringText1 " << endl; }private:};
class DerivedString :public StringText
{public:DerivedString() { cout << " DerivedString " << endl; }~DerivedString() { cout << " ~DerivedString " << endl; }
};
class DerivedString1 :public StringText1
{public:DerivedString1() { cout << " DerivedString1 " << endl; }~DerivedString1() { cout << " ~DerivedString1 " << endl; }
};
int main()
{StringText* s = new DerivedString();delete s;// DerivedString没有调用析构函数会造成资源泄露StringText1* s1 = new DerivedString1();delete s1;/*运行结果 故没有触发~DerivedStringStringTextDerivedString~StringTextStringText1DerivedString1~DerivedString1~StringText1*/return 0;
}

赋值运算

这个比较简单,就粗略聊聊吧
1 重载=运算符 的返回值 为DerivedString&
可实现基于a=b=c的操作。
2 自我赋值
确保当对象是自我赋值的时候有良好的习惯:比较来源对象和目标对象的地址,语句顺序,以及copy and swap
3 确保复制所有成员,比如类中的类成员,以及基类的成员

class Widget
{public:Widget();~Widget();Widget& operator = (const Widget & rhs){DerivedString* pOrig = pb;pb = new DerivedString(*rhs.pb);delete pOrig;return *this;}
private:DerivedString* pb;};

构造/析构/赋值运算--龙之介《Effective C++》实验室相关推荐

  1. 读书笔记 Effective C++: 02 构造析构赋值运算

    条款05:了解C++默认编写并调用的哪些函数 编译器会为class创建: 1. default构造函数(前提是:没有定义任何构造函数): 如果已经声明了一个构造函数,编译器就不会再创建default构 ...

  2. Effective C++ --2 构造/析构/赋值运算

    上一部分Effective C++ --1 让自己习惯C++ 5. 了解C++默认编写并调用哪些函数 (1)   编译器暗自为类创建默认构造函数.拷贝构造函数.拷贝赋值函数和析构函数. (2)   拷 ...

  3. Effective C++ -- 构造析构赋值运算

    05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...

  4. Effective C++ 之《构造/析构/赋值运算》

    条款05:了解C++默默编写并调用了哪些函数 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 条款07:为多态基类声明virtual析构函数 1. 带多态性质的父类,应该声明一个virtual ...

  5. Effective C++学习笔记——构造/析构/拷贝运算

    条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数. 应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会 ...

  6. 声明及赋值_重述《Effective C++》二——构造、析构、赋值运算

    关于本专栏,请看为什么写这个专栏.如果你想阅读带有条款目录的文章,欢迎访问我的主页. 构造和析构一方面是对象的诞生和终结:另一方面,它们也意味着资源的开辟和归还.这些操作犯错误会导致深远的后果--你需 ...

  7. 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学

    <深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...

  8. 【从零学习OpenCV 4】Mat类构造与赋值

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...

  9. C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数

    类的拷贝构造函数与赋值运算不同,拷贝构造函数是对这个类进行初始化的过程,而赋值是删除原有的东西,赋予它新的东西. 但是二者在实现上是互通的. template<class T> graph ...

最新文章

  1. Cisco Catalyst交换机密码恢复策略
  2. 远程连接Linux,如何使程序断开连接后继续运行
  3. HTML+CSS+JS实现 ❤️制作loading动画效果❤️
  4. 公共的数据库访问访问类 SqlHelper.cs
  5. Unity用GUI绘制Debug/print窗口/控制台-打包后测试
  6. HTTP传递数据的几种方法
  7. linux环境编程apue和unp,UNIX高级环境编程:源码(apue)下载 编译和运行
  8. 计算机配置主板技术参数,i9-7900X/7920X配什么主板好?i9-7920X/7900X主板搭配与参数详解...
  9. USB Type C 接口引脚详解
  10. 编写矩阵运算程序(C语言)
  11. 计算机小高考成绩,2018江苏小高考成绩出来了!昆山*亮眼的学校是…
  12. WPS vbe6ex.olb 不能加载
  13. Matlab 校验方法
  14. amigo幸运字符什么意思_超不清视频播放器-用Python将视频转成字符
  15. Android JNI总结
  16. 这篇文章教你用消除笔去水印
  17. 推荐几个有趣且实用的微信小程序……
  18. PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
  19. 免费激活Windows系统以及office办公软件
  20. iData数据工厂V2.2(一个平台、一套数据、一体生产)试用功能受限解决方案在文尾

热门文章

  1. 纪中游记 - Day45
  2. php微信支付怎么来测试_PHP微信支付通知处理方式实现方法
  3. 客户文章 | Plant Physiology:RNA-seq(转录组测序)和DAP-seq技术联合应用于OsCCA1通过ABA信号调控水稻适应非生物胁迫机制研究
  4. 重磅!ChatGPT 网页版来啦!响应速度超快!
  5. python彩票预测与分析_297期四叔福彩3D预测奖号:奇偶、大小分析
  6. HTML小案例: 填写简历信息页面布局
  7. 氮化硼气凝胶介绍-供应Al2O3-SiO2-ZrO2三元复合/MTMS-SiO2甲基三甲氧基硅烷改性氧化硅颗粒/聚酰亚胺/二氧化硅气凝胶定制
  8. 华工计算机基础知识随堂作业答案,新版华工《计算机应用基础》随堂练习.doc...
  9. SNF开发平台WinForm-Grid表格控件大全
  10. 设计模式(11)代理模式The Proxy Pattern - 1 - 远程代理rmi