派生类中的构造函数

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

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[]字符串数组拷贝到存储空间中。因此也可以说明基类的构造函数先于派生类的构造函数执行。


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值