构造/析构/赋值运算--龙之介《Effective C++》实验室
条款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++》实验室相关推荐
- 读书笔记 Effective C++: 02 构造析构赋值运算
条款05:了解C++默认编写并调用的哪些函数 编译器会为class创建: 1. default构造函数(前提是:没有定义任何构造函数): 如果已经声明了一个构造函数,编译器就不会再创建default构 ...
- Effective C++ --2 构造/析构/赋值运算
上一部分Effective C++ --1 让自己习惯C++ 5. 了解C++默认编写并调用哪些函数 (1) 编译器暗自为类创建默认构造函数.拷贝构造函数.拷贝赋值函数和析构函数. (2) 拷 ...
- Effective C++ -- 构造析构赋值运算
05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...
- Effective C++ 之《构造/析构/赋值运算》
条款05:了解C++默默编写并调用了哪些函数 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 条款07:为多态基类声明virtual析构函数 1. 带多态性质的父类,应该声明一个virtual ...
- Effective C++学习笔记——构造/析构/拷贝运算
条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数. 应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会 ...
- 声明及赋值_重述《Effective C++》二——构造、析构、赋值运算
关于本专栏,请看为什么写这个专栏.如果你想阅读带有条款目录的文章,欢迎访问我的主页. 构造和析构一方面是对象的诞生和终结:另一方面,它们也意味着资源的开辟和归还.这些操作犯错误会导致深远的后果--你需 ...
- 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学
<深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...
- 【从零学习OpenCV 4】Mat类构造与赋值
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数
类的拷贝构造函数与赋值运算不同,拷贝构造函数是对这个类进行初始化的过程,而赋值是删除原有的东西,赋予它新的东西. 但是二者在实现上是互通的. template<class T> graph ...
最新文章
- Cisco Catalyst交换机密码恢复策略
- 远程连接Linux,如何使程序断开连接后继续运行
- HTML+CSS+JS实现 ❤️制作loading动画效果❤️
- 公共的数据库访问访问类 SqlHelper.cs
- Unity用GUI绘制Debug/print窗口/控制台-打包后测试
- HTTP传递数据的几种方法
- linux环境编程apue和unp,UNIX高级环境编程:源码(apue)下载 编译和运行
- 计算机配置主板技术参数,i9-7900X/7920X配什么主板好?i9-7920X/7900X主板搭配与参数详解...
- USB Type C 接口引脚详解
- 编写矩阵运算程序(C语言)
- 计算机小高考成绩,2018江苏小高考成绩出来了!昆山*亮眼的学校是…
- WPS vbe6ex.olb 不能加载
- Matlab 校验方法
- amigo幸运字符什么意思_超不清视频播放器-用Python将视频转成字符
- Android JNI总结
- 这篇文章教你用消除笔去水印
- 推荐几个有趣且实用的微信小程序……
- PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
- 免费激活Windows系统以及office办公软件
- iData数据工厂V2.2(一个平台、一套数据、一体生产)试用功能受限解决方案在文尾
热门文章
- 纪中游记 - Day45
- php微信支付怎么来测试_PHP微信支付通知处理方式实现方法
- 客户文章 | Plant Physiology:RNA-seq(转录组测序)和DAP-seq技术联合应用于OsCCA1通过ABA信号调控水稻适应非生物胁迫机制研究
- 重磅!ChatGPT 网页版来啦!响应速度超快!
- python彩票预测与分析_297期四叔福彩3D预测奖号:奇偶、大小分析
- HTML小案例: 填写简历信息页面布局
- 氮化硼气凝胶介绍-供应Al2O3-SiO2-ZrO2三元复合/MTMS-SiO2甲基三甲氧基硅烷改性氧化硅颗粒/聚酰亚胺/二氧化硅气凝胶定制
- 华工计算机基础知识随堂作业答案,新版华工《计算机应用基础》随堂练习.doc...
- SNF开发平台WinForm-Grid表格控件大全
- 设计模式(11)代理模式The Proxy Pattern - 1 - 远程代理rmi