posts - 2,  comments - 3,  trackbacks - 0

1. 应该提供一个默认的构造函数,并使用初始化列表,初始化成员。

2. 对于单形参的构造函数,最好声明为explicit,可以避免编译器试图产生隐式的类类型转换。

3. static成员函数,只能访问类的static成员,且不能被声明为const类型,也不能被声明成virtual函数。

4. 将一个成员声明为mutable,可以在const类型成员函数中修改它的值,即使该成员属于const类型的对象。

5. 派生类只能通过派生类对象访问基类的protected成员,派生类对其基类类型对象的protected成员没有特殊

访问权限。

6. 不应在派生类的构造函数中,为直接基类的成员赋值,同时,在复制构造函数中,应显示的调用基类的复制

构造函数,为基类对象赋值,如果不显示调用,则派生类中的基类成员将是默认值,而其他成员是一个对象的副

本。也即基类部分没有复制。在赋值操作符中,也应显示调用直接基类的复制操作
    eg: baseClass::operator=();

8. 赋值操作符应避免自身赋值。

9. 析构函数的调用顺序与构造函数相反,先调用派生类的析构函数,再调用基类的析构函数,每个类的析构函

数只负责释放自己类的成员。

10. 虚函数性质可被继承,继承后也为虚函数。

11. 切记,指针调用虚函数,在运行时,具体调用什么版本,要看在发生调用时,指针的类型。
    eg: 如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。

12. 局部作用域中的函数不会重载全局作用域中的函数,同样,派生类中的成员函数,不会重载基类中的成员函

数。同时,一旦派生类重定义了基类中的某个成员函数,那么基类中的这个成员函数的所有重载版本在派生类中

都不可用。

13. 要使用基类的某个成员函数的所有重载版本,那么派生类要么重定义基类中成员函数的所有重载版本,要么

一个都不定义,但是只想改变一个或几个重载版本岂不是很麻烦,这时在派生类中用using操作符,派生类不用

重定义所继承的每一个基类版本,它可以为重载成员提供 using声明。一个 using 声明只能指定一个名字,不

能指定形参表,因此,为基类成员函数名称而作的 using 声明将该函数的所有重载实例加到派生类的作用域。

将所有名字加入作用域之后,派生类只需要重定义本类型确实必须定义的那些函数,对其他版本可以使用继承的

定义。

14. 确定函数调用遵循以下四个步骤:
    1. 首先确定进行函数调用的对象、引用或指针的静态类型。
    2. 在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数

或者查找完最后一个类。如果不能在类或其相关基类中找到该名字,则调用是错误的。
    3. 一旦找到了该名字,就进行常规类型检查,查看如果给定找到的定义,该函数调用是否合法。
    4. 假定函数调用合法,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码

以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数。

posted on 2011-08-30 14:07 Lshain 阅读(440) 评论(0)  编辑 收藏 引用 所属分类: C++ 类
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿

文章分类(46)

文章档案(33)

ACM

Algorithm Link

BLOG

Format analysis

Forum

Math

mirror

OpenGL

Protocol Analyzer

Recent Contests

Search

WIN32 Programming

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜