C语言中复杂构造函数深入分析
C语言中复杂构造函数深入分析
摘要:C++语言构造函数的作用是初始化对象。构造函数的多种形式都可以用构造函数初始化列表代替来提高效率,所以用C++语言编程时应多使用构造函数初始化列表的形式初始化对象。本文的目的是对C+++语言的复杂构造函数有一个系统的认识落千丈 ,避免程序设计中出现失误。
关键词:类 构造函数 列表 参数
中图分类号:TP311.1 文献标识码:A 文章编号:1007-9416(2011)09-0143-02
在类定义时,如果用户没有显示定义构造函数,则系统会提供一个默认的构造函数,仅负责创建对象,而不做任何初始化工作,用户可以显示定义构造函数,用来初始化数据成员和资源。
复杂构造函数常出现在派生类中,其实可以把它们看成是简单构造函数与构造函数初始化列表的混合形式,也可认为是特殊的构造函数初始化列表。本文以派生类的构造函数和虚基类的构造函数为主要探讨对象。
1、派生类构造函数
C++语言支持多重继承,从而大大增强了面向对象程序设计的能力。多重继承是一个类从多个基类派生而来的能力。派生类实际上获取了所有基类的特性。当一个类是两个或多个基类的派生类时,必须在派生类名和冒号之后,列出所有基类的类名,基类间用逗号隔开。
对于单基类的情况,下面是一个例子:
例1:class Y {…}
class X : public Y {…}
X one;
下面是例1中相关构造函数的调用顺序:
Y(); //基类的构造函数
X(); //继承类的构造函数
简单多层构造函数调用顺序通常为:当一个类的对象被创建时系统会首先调用其构造函数,全局范围内定义的构造函数,在文件中的任何其他函数(包括main)执行前调用,但不同文件之间的全局对象构造函数的执行顺序是不确定的。当程序执行到对象定义时系统自动调用局部对象的构造函数,用static声明的局部对象的构造函数只在程序执行首次到达对象定义时调用一次。
多基类情况的例子如下:
例2:class X : public Y, public Z
X one;
多基类继承的构造函数以声明的先后依次序调用:
Y(); //基类构造函数按声明顺序被调用
Z();
X();
那么参数传递和构造函数的调用过程如何呢?举例如下:
例3:#include
using namespace std;
class Cbase //基类CBase
{ int a;
public:
CBase(int na)
{a=na;
cout<
}
int GetA()
{return a;}
};
class CDerive : public Cbase
//CBase的派生类CDerive
{ int b;
public:
CDerive(int nb,int na):CBase(na)
//将参数na传递给基类CBase
{ b=nb;
cout<
}
int GetB()
{return b;}
};
//CDerive的派生类CSubDerive
class CSubDerive : public CDerive
{ int c;
public:
CSubDerive(int nc,int nb,int na):CDerive(nb,na)
//向直接基类传递参数,不负责向间接基类传递参数
c=nc;
cout<
int GetC()
{return c;}
void show()
{cout<
cout<
cout<
cout<
}
};
void main()
{ CSubDerive obj(30,20,10);
cout<
obj.show();
}
例3运行结果如图1所示,相关构造函数的具体调用顺序