深度探索c++对象模型 第二章
1,c++转换函数:显示转换和隐式转换。
隐式转换为程序员提供了很大的变量。比如整形提升,普通类型转换为类类型(operator int())都为程序带来无尽的方便。试想,如果没有整形提升,一个short类型要加上一个int类型。需要手动转换类型才能运算。
但是隐式转换也会遇到问题。当程序出现问题,如果是隐式转换引起的,也很难排查到。所以在程序设计的时候,一定要考虑的非常仔细。
2,类中如果没有声明构造函数,编译器会给类声明一个默认构造函数。为什么要这么做?
原因是:编译器对所有的类的构造都要调用构造函数。所以,如果类设计程序员没有为类声明构造函数,则编译器不得不这么做。并且,编译器声明的默认构造函数什么都不会做(trivial,无用的)。不会将数据成员都清0的。只是为了满足调用规则。
3,
4,如果一个类没有定义构造函数,则默认构造函数则什么都不做。但是如果这个类中有其他类对象,则会调用这个类对象的构造函数。这个调用时编译器安插在默认构造函数之中的。如果这个类中包含多个类对象,则会按照顺序将调用对应对象的构造函数的调用安插到默认构造函数。但本类的其他数据成员仍然不能够做任何初始化操作,这个责任是程序员的。当然,如果本来有定义构造函数。那么编译器还是会将调用其他成员对象的构造函数安插到自定义的构造函数中。
5,如果一个没有自定义构造函数的类继承自一个含有构造函数的基类,则派生类的默认构造函数是非无用的(nontrival)。也就是说,派生类的构造函数会被编译器安插代码,用以调用基类构造函数。如果有自定义构造函数的话,则编译器在基类的自定义构造函数中安插代码,用以调用基类的构造函数。
6,当类中含有虚函数时,我们知道,这样的类对象是含有一个指针指向虚函数表的。那类对象的这个指针是怎么来的?
事实上,这个指针的生成是编译器的责任。它会将生成该指针的代码安插到默认构造函数会程序员自定义构造函数。
7,类的深拷贝和浅拷贝
默认复制构造、默认赋值构造函数都使用浅拷贝。当需要深拷贝时,自己显示定义复制构造函数、赋值构造函数。当类中含有的对象本身支持自定义的复制构造函数、赋值构造函数,那么如果本类的其他数据成员都是基本数据类型的话,那可以不用显示定义复制构造函数、赋值构造函数。因为编译器负责将调用成员对象的复制构造函数、赋值构造函数的代码安插到本类的复制构造函数、赋值构造函数。当然,如果本类中有char*这样的类型,则,需要手动增加本类的复制构造、赋值构造函数。参考c++Primer Plus 第6版第12章。
最新文章
- .Net全景视图
- Java LinkedList 源码剖析
- mac安装 配置 ant
- Ubuntu、CentOS上运行.net桌面程序
- Web Scale IT 与 6 种 DevOps 工具
- poj2245
- FLEX 网格布局及响应式处理
- WindowsclientC/C++编程规范“建议”——前言
- Guest与virtio netdev交互模式
- chapter8_2 预编译
- Tinyproxy
- 11.巨坑,注意了,关于显示不正常的问题,localstorage的存储问题
- java 分解质因数 基础增强
- oracle 报错无法从套接字获取更多数据
- HTML5 新的 Input 类型
- cmd解压压缩包
- WIN10在loadrunner安装或path4插件安装时遇到的管理员阻止程序运行---解决方案(可用)
- 第三百四十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理
- Swift学习——Swift基础具体解释(一)
- 迟到的thuwc&;noiwc2018总结
热门文章
- [ACM] POJ 3096 Surprising Strings (map使用)
- 卷积、卷积矩阵(Convolution matrix)与核(Kernel)
- ThreadPoolExecutor原理和使用
- C++中new和delete的背后(最后还是调用了MSVCR90的malloc)
- 基于IOCP的高速文件传输代码
- C语言反汇编入门实例
- 《Microsoft编写优质无错C程序秘诀》提纲
- PHP 的魔术方法及其应用
- EnterpriseLibrary 6.0 AOP 使用问题
- QT5.8 VS2017 编译教程(可以使用VS2017 XP兼容包)