读书人

C++语言特征:构造函数,析构函数,虚函

发布时间: 2012-08-08 14:32:45 作者: rapoo

C++语言特性:构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏
构造函数
1.初始化对象成员;
2.创建类对象;
由于虚函数是建立在对象的基础上的,因此构造函数不能声明为虚函数;虚函数是在执行的时候才识别,根据具体对象进行动态绑定.
每个类对象都有一个默认构造函数.当一个对象被在堆上创建的时候,第一步先执行new操作,第二步才会执行构造函数体,因此尽可能不要在构造函数内部动态申请太多的资源,以免引起内存泄露.
详情如下:


图1
(int*)(&cBase) //强制转换cBase对象在内存中的内容为int*[0x0031fce4],它指向cBase对象的第一个成员的地址,即虚函数表的地址[0x011e7868]
(int*)*(int*)(&cBase) //对虚函数表的地址进行解引用,*(int*)(&cBase)指向的地址就是虚函数表的地址,然后转换为int*,它指向虚函数表的第一个成员,即_vfptr[0] ,地址为[0x011e121c]


下面是关于基类地址,以及虚函数表、基类成员、派生类成员的详细分布:

C++语言特征:构造函数,析构函数,虚函数,内联函数,静态成员函数,重载,覆盖,隐藏

图2

从上面的图中我们可以看到,派生类的成员a()覆盖了基类的成员a()
C++中的重载、覆盖、隐藏
1.重载从最简单的角度来讲只发生在对象内部,对象内部同名的函数,但是参数个数或参数类型不同;

2.覆盖就是上面图中标示的那种情况;

3.当派生类和基类的函数同名,而且基类同名函数前virtual修饰符,基类的同名函数被隐藏;


内联函数:
关键字inline,功能类似宏替换,具有函数的结构,在编译时刻根据函数名来替换成对应的代码,在代码量小的重复次数多的情况下,比较高效.不是适合复杂代码,同时是否能够实现内联的功能,具体要依赖编译器,有可能编译器根据实际情况当成普通函数来处理.
静态成员函数:
静态成员在同类对象中只有一个实例,因此可以用来统计同类对象的计数;
静态成员函数独立于类对象,因此即使类对象不存在,静态成员函数依然可以被调用,静态成员函数只能调用静态成员变量在这样的情况下.

实例:Singleton模式,保证一个类只有一个实例对象,同时使该实例只有一个全局访问点.


C++对象属性:public, protected, private

共有继承,基类的公共成员和保护成员可以作为其派生类的公共成员和保护成员.

私有继承,基类的共有成员和私有成员都作为其派生类的私有成员.基类的成员只能由直接派生类来访问,不能再往下继承。

保护继承,基类的共有成员和保护成员都作为其派生类的保护成员

读书人网 >C++

热点推荐