派生类中的构造函数

对于一般的类来说,如果不声明构造函数,则自动调用默认构造函数

class A{

public:

A();

};

如果声明了另外一个构造函数,则会覆盖默认构造函数

class A{

public:

A(int n){a=n};

private:

int a;

};

此时如果声明一个对象,则不可以直接A a;必须要A a(3);

多数情况下,编译器为类生成一个默认构造函数,只有以下两种情况除外:

1、一个类显式地声明了任何构造函数,编译器不再生成默认构造函数,除非设计者也显式声明了默认构造函数

class A{

public:

A();

A(int n){a=n};

private:

int a;

};

2、类声明了非公有的默认构造函数,编译器不生成默认构造函数,即通过将默认构造函数声明成非公有的形式将其屏蔽

——————————————以上为一般情况下类的构造函数——————————————————————

对于派生类中的构造函数

1、如果基类拥有构造函数但没有默认构造函数,那么派生类必须显式地调用基类的某个构造函数

class A{

public:

A(int n){a=n};

private:

int a;

};


class B::public A{

public:

B(int n):A(n){b=n}

private:

int b;

};

2、如果基类有默认构造函数(未声明或显式声明),派生类也定义了一些构造函数,但是派生类的任何构造函数都没有显式地调用基类的某个构造函数,那么当创建一个派生类对象时,基类的默认构造函数会被自动调用。此时不用在派生类中显式调用基类的构造函数。

class A{

public:

A();

A(int n){a=n};

private:

int a;

};


class B::public A{

public:

B();//定义一个B的对象时,会先调用A(),再调用B();

private:

int b;

};

总结起来也就是说,派生类如果不想显式调用基类的构造函数,基类必须有有效的默认构造函数,否则派生类必须要显式调用基类的某一个构造函数。

给一个例子:

class T{

public:

T(int len=100){names=new string[maxno=len];}

protected:

string* names;

int maxno

};


class B : public T{

public:

B(const string s[],int si):T(si){

for(int i=0;i<si;i++)

names[i]=s[i];

}

} ;

创建B对象的时候要传入两个变量,si作为调用T的构造函数new一个si长度的字符串数组,用来为string类型的数组进行存储分配。再将传入的string[]字符串数组拷贝到存储空间中。因此也可以说明基类的构造函数先于派生类的构造函数执行。


阅读更多

没有更多推荐了,返回首页