现在的位置: 首页 > 综合 > 正文

《more effective c++》基础部分读书笔记

2018年04月04日 ⁄ 综合 ⁄ 共 2060字 ⁄ 字号 评论关闭

 

1.  多态和指针算术不能混合运用。数组对象几乎总是会涉及到指针的算术运算,故数组和多态不要混合运用。(T3,指条款3,下同

2. 大部分纯虚函数并没有实现码,但是纯虚析构函数是个例外。(T33

3. 将具象基类以抽象基类取而代之,减少了企图以多态方式对待数组的机会。(T33

4. 如果你有两个具象类C1C2,而你希望C2public方式继承C1,你应该将原本的双类继承体系改为三类继承体系:产生一个新的抽象类,并令C1C2都以public的方式继承A。(T33

5. 删除一个非new operator获得的指针,其结果未定义。(T4

6. 所谓隐式型别转换操作符,是一个拥有奇怪名称的成员函数:关键词operator后加一个型别名称。如:class Rational{public:…..operator double() cosnt;},在以下情况下double()会被调用:Rational r(1,2);double d = 0.5 * r;(T5)

7. 只需将constructors声明为explicit,编译器便不能因隐式型别转换的需要而调用它们,但显式型别转换仍是允许的。(T5

8. C++语言中,允许++操作符的两种形式拥有重载能力:postfixprefix,操作符的前置式和后置式返回不同的型别。前置式返回一个reference,后置式返回一个const对象。前置式++increment and fetch(累加而后取出),后置式++fetch and increment(取出而后累加)。

前置:

UPInt& UPInt::operator++()

{

     *this+=1;

      return *this;

}

后置:

const UPInt UPInt::operator++(int)

{

       UPInt oldValue = *this;

       ++*this;

       return oldValue;

}T6

9. 对一个null指针调用strlen,结果未可预期。(T7)。

10.new operator(C++ primer称为new expression)该操作符由语言内建,就像sizeof那样,不能改变意义,不可重载,总是做着相同的事情:一是分配内存,而是为刚分配的内存中的对象设定初值:eg: string *ps = new string(“hello world”);

operator new:表示一个函数,通常声明如下:void*operator new(size_t size);取得operator new 返回的内存并将之转换为一个对象,是new operator的责任。也就是说操作符调用了函数。如上面的语句等同于这样做(T4):

  

 

placement new:用于在指定的内存上构造对象。如下面的例子:

总之,如果你希望对象产生于堆上,请使用new operator,它不但分配内存还为该对象调用一个constructor。如果你只是打算分配内存,请调用operator new,这样的话没有constructor被调用。如果你打算在heap objects产生时自己决定内存分配方式,请重写一个operator new,并使用new operator,它将会调用你刚写的operator。如果你打算在已分配(并拥有指针)的内存上构造对象,请使用placement new。(T4&T8

11. string的拷贝构造函数的一个常见做法是:一旦S2S1为初值,S2S1便各有自己的一份字符串副本。如:string s1=”hello”(堆中),string s2 =s1;(T18)

12. 有些函数,如operator*,必须返回对象,它就是必须如此;返回constructor arguments以取代对象,能够让编译器消除临时对象的成本。(T20)

13.可以用重载技术避免产生临时对象.(T21)


抱歉!评论已关闭.