- 虚函数可能会在执行前调整this指针的位置,例如多继承的情况下。基类指针调用子类虚函数,必须调整指针才能访问到正确的成员位置。
- 没有任何数据成员及虚函数的类对象,占用空间为1字节。
- NRV(named return value)优化可以使程序更少地调用构造与析构函数,减少复制运算。例如对于
与void func(C1& c1)函数的调用完全效果一样。C1 func() { C1 temp; return temp; } C1 t = func();
- 如果一个临时对象被绑定于一个引用,则对象将残留,直到该引用生命周期结束或直到临时对象的生命范畴结束-视哪一种情况先到达而定。也就是说: C1& c1 = C1(); c1.func(); 能够正确执行,没有任何危险与违规。而如果通过函数返回临时变量的引用,则不受以上条件约束,func()函数将违规访问。
- 不要将new到的指针进行基类型转换后用于delete,否则无法正常释放。假设C2继承于C1。则 C1* p = new C2(); delete p; 会导致运行时错误(能正确析构,却无法正确释放内存)。
- template的名称决议方式:如果有如下的模板定义情况:
而在实现的代码中,又出现以下情况:extern double foo(double); template <class type> class ScopeRules { public: void invariant() { _member = foo(_val); } type type_dependent() { return foo(_member); } private: int _val; type _member; };
那么当调用invariant()时,将使用double foo(double)函数,而调用type_dependent()时,会使用int foo(int)。因为_val的类型是int,与模板没有任何关系,所以将选用模板声明处所在的元素可见性。而type_dependent()函数由于使用了_member,与模板参数相关,因此使用模板使用处的元素可见区域。调用最合适的int foo(int)。extern int foo( int ); ScopeRules<int> sr0;
注:在本人的验证过程中,VS2010两个地方均调用了int foo(int),和书本上并不相同。 - 模板类中的成员函数并不一定都会生成代码,一般编译器只会生成实际被调用到的函数,其余函数代码完全置之不理,即使里面有语法错误。