More Effective C++ - 章节一 : 基础议题
2021-05-23 13:31
标签:基于 对象 虚基类 weight code pre 解决 volatile 时间 1. 仔细区分 pointers 和 references references和pointers的差别描述如下: pointer:当需要考虑"不指向任何对象"时,或者是考虑"在不同时间指向不同对象"的能力时,应该采用pointer。前一种情况可以将pointer设为null,后一种可以改变pointer所指对象。 reference:当确定"总是会代表某个对象",而且"一旦代表了该对象就不能再改变",那应该使用reference。 reference不能为空,因此无需做判空操作,相对pointer使用效率更高。某些操作符重载 operator[],operator= 采用reference实现。 结论: 当知道需要指向某个东西,而且绝不会改变指向其他东西,或是当实现一个操作符而其语法需求无法由pointers实现,就应选择references。 其任何时候,请采用 pointers。 2. 最好使用 C++ 转型操作符 由于旧式的c转型几乎允许任何类型转换为任何其他类型,这样是十分拙劣的,如果每次转型能够精确地指明转型意图,会更好。还有就是旧式转型难以辨识,导致查看代码时,会遗漏转型操作。C++ 引进4个新的转型操作符: 旧式 C 转型: C++ 转型: 如果你想为一个不涉及继承机制的类型执行转型动作,可使用static_cast;要改变常量性,必须使用const_cast;涉及继承机制,使用dynamic_cast 或者 static_cast; reinterpret_cast 把一个指针转换成一个整数,也可以把一个整数转换成一个指针。 3. 绝对不要以多态的方式处理数组 大致代码如下: 上述代码中,编译器为了能够访问整个数组,编译器必须有能力决定数组对象大小,编译器认为大小为BST类大小,但是我们传入的是其子类,而子类对象大小肯定是大于父类的,因此导致这里会发生不可预期错误。 多态和指针算术不能混用。而数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用。 4. 非必要不提供 default constructor 由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数,被称为默认构造函数(default constructor)。 在一个完美世界中,凡可以"合理的从无到有生成对象"的class,都应该内含默认构造函数,而"必须有某些外来信息才能生成对象"的class,则不必拥有默认构造函数。但是,当一个类缺乏default constructor,使用时会受到限制。 有介绍三种办法来解决无默认构造函数的限制: 1. non-heap 数组 2. 指针数组。 缺点:指针数组要删除,否则内存泄漏;保存指针,浪费内存。 3. placement new。分配内存时可指定内存位置。 缺乏 default constructor 类的第二个缺点,将不适用于许多基于模板实现的容器类。 第三个缺点,虚基类没有默认构造函数,将导致所有继承类都要注意提供虚基类构造函数自变量,十分麻烦。 缺乏默认构造虽然会导致上述三种限制,但是如果不需要默认构造函数的类却加了默认构造函数,将导致该类内部member functions逻辑变得复杂,以及影响调用该类的客户代码的效率。 因此非必要不提供 default constructor。 2018年10月1日14:59:02 More Effective C++ - 章节一 : 基础议题 标签:基于 对象 虚基类 weight code pre 解决 volatile 时间 原文地址:https://www.cnblogs.com/blog-yejy/p/9734683.html(type) expression
1. static_cast
// 简单继承关系
class BST{...};
class BalancedBST: public BST{...};
// 打印接口
void printfBSTArray(ostream& s, const BST arrry[], int numElements)
{
for(int i = 0; i
class foo
{
public:
foo(); // 默认构造函数
...
};
class foo
{
public:
foo(int Id); // 构造函数
...
};
foo bestfoo[10]; // 错误! 无法调用构造函数
foo *best = new foo[10]; // 错误! 无法调用默认构造函数
foo fooTest[] = {foo(1), foo(2), foo(3)}; // 构造函数获得id,可以成功
typedef foo* foo_ptr;
foo_ptr bestfoo[10]; // 没问题,存在的指针,不用调用构造函数
foo_ptr *best = new foo_ptr[10] // 也没问题,数组堆上存的是指针
for(int i = 0; i
// 首先申请一块适当大小的缓存,可以是堆上的,也可以是其他特殊缓存(例如共享内存)
void *rawMemory = operator new[](10*sizeof(foo));
// 让 best 指针指向该块内存首地址
foo* best = static_cast
上一篇:复习-进程的调度算法
下一篇:JAVA知识点总结篇(三)
文章标题:More Effective C++ - 章节一 : 基础议题
文章链接:http://soscw.com/index.php/essay/88242.html