![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
《More Effective C++》笔记
文章平均质量分 62
Nim的辙迹
这个作者很懒,什么都没留下…
展开
-
条款1:仔细区别pointers和references
**本文描述pointers和references的差异,并告诉你它们的适当使用时机。**首先必须认知一点,没有所谓的null reference,一个reference必须总代表某个对象。换个角度说,如果这个变量总是必须代表一个对象,也就是如果你的设计并不允许这个变量为null,那么你应该使用reference。先看一种情况:int *pc=0; //将pointer设定为nullint& r原创 2016-12-02 16:59:54 · 565 阅读 · 0 评论 -
条款2:最好使用C++转型操作符
** 印象笔记: 为解决C旧式转型的缺点,C++导入4个新的转型操作符(cast operators):static_cast, const_cast, dynamic_cast 和 reinterpret_cast。 **对大部分使用目的而言,面对这些操作符你唯一需要知道的便是,过去习惯的写码形式:(type) expression现在应该改为这样:static_cast<type>(e原创 2016-12-02 18:10:40 · 441 阅读 · 0 评论 -
条款3:绝对不要以多态方式处理数组
** 印象笔记: C++允许通过base class的pointers和references来操作“derived class objects所形成的数组”。但它几乎绝不会如你所预期般地运作。 **继承的最重要性质之一是:你可以通过“指向base class objects”的pointers或references,来操作derived class objects。 如:Shape *原创 2016-12-02 19:00:01 · 508 阅读 · 0 评论 -
条款4:非必要不提供default constructor
** 印象笔记: **default constructor 也就是说不给任何自变量就可调用者。Constructors用来将对象初始化,所以default constructors的意思是在没有任何外来信息的情况将对象初始化。数值之类的对象可以被合理地初始化为0或一个无意义值。其他诸如指针之类的对象亦可以被合理地初始化为null或无意义值。数据结构如linked lists,maps等可以原创 2016-12-02 23:26:05 · 421 阅读 · 0 评论 -
条款5:对定制的“类型转换函数”保持警觉
什么是类型转换函数? 1)转换构造函数可以将一个指定类型的数据转换为类的对象 2)类型转换函数的作用是将一个类的对象转换成另一类型的数据 3)一个类中同时又转换构造函数和类型转换函数将产生二义性,程序报错举一个复数的例子就明白了:class Complex{public: Complex( ){real=0;imag=0;} Complex(double r,do原创 2016-12-04 19:42:45 · 320 阅读 · 0 评论 -
条款6:区别increment/decrement操作符的前置和后置形式
//前置式:累加然后取出(increment and fetch)//前置式返回一个referenceUPInt& UPInt::operator++(){ *this+=1; //累加 return *this; //取出 }//后置式:取出然后累加(fetch and increment)const UPInt UPInt::operator++(int){原创 2016-12-06 22:02:27 · 359 阅读 · 0 评论 -
条款7:千万不要重载&&,||和,操作符
C++对于“真假值表达式”采用所谓的“骤死式”评估方式。意思是一旦该表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍告结束。如果在global scope或是在每个class内对operator&&和operator||两函数进行重载工作,那么“函数调用 语义”会取代“骤死式 语义”。 也就是说,下面这个式子:if(expression1 && expression2) ...会被原创 2016-12-06 23:10:05 · 396 阅读 · 0 评论 -
条款8:了解各种不同意义的new和delete
new operator,这个操作符是由语言内建的,不能被改变意义,总是做相同的事情。它的动作分为两方面: 第一,它分配足够的内存,用来放置某类型的对象。 第二,它调用一个constructor,为刚才分配的内存中的那个对象设定初值。你能够改变的是用来容纳对象的那块内存的分配行为。 new operator调用某个函数,执行必要的内存分配动作,你可以重写或重载那个函数,改变其行为。这个函数的名原创 2016-12-09 20:38:27 · 321 阅读 · 0 评论