1. 多态和指针算术不能混合运用。数组对象几乎总是会涉及到指针的算术运算,故数组和多态不要混合运用。(T3,指条款3,下同)
2. 大部分纯虚函数并没有实现码,但是纯虚析构函数是个例外。(T33)
3. 将具象基类以抽象基类取而代之,减少了企图以多态方式对待数组的机会。(T33)
4. 如果你有两个具象类C1和C2,而你希望C2以public方式继承C1,你应该将原本的双类继承体系改为三类继承体系:产生一个新的抽象类,并令C1和C2都以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++语言中,允许++和—操作符的两种形式拥有重载能力:postfix和prefix,操作符的前置式和后置式返回不同的型别。前置式返回一个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):
void* memory=operator new(sizeof(string)); call string::string(“hello world”),on *memory; string *ps=static_cast<string*>(memory);
placement new:用于在指定的内存上构造对象。如下面的例子:
void* rawMemory=operator new[] (10*sizeof(EquipmentPiece)); EquipmentPiece *bestPieces=static_cast<EquipmentPiece*>(rawMemory); for(int i=0;i<10;++i) new(&bestPieces[i]) EquipmentPiece(ID Number);
总之,如果你希望对象产生于堆上,请使用new operator,它不但分配内存还为该对象调用一个constructor。如果你只是打算分配内存,请调用operator new,这样的话没有constructor被调用。如果你打算在heap objects产生时自己决定内存分配方式,请重写一个operator new,并使用new operator,它将会调用你刚写的operator。如果你打算在已分配(并拥有指针)的内存上构造对象,请使用placement new。(T4&T8)
11. string的拷贝构造函数的一个常见做法是:一旦S2以S1为初值,S2与S1便各有自己的一份字符串副本。如:string s1=”hello”(堆中),string s2 =s1;(T18)
12. 有些函数,如operator*,必须返回对象,它就是必须如此;返回constructor arguments以取代对象,能够让编译器消除临时对象的成本。(T20)
inline const Rational operator*(const Rational&lhs,const Rational&rhs) {return rational(lhs.numerator()*rhs.numerator(),lhs.denominator()*rhs.denominator());}
13.可以用重载技术避免产生临时对象.(T21)