对于一般的类来说,如果不声明构造函数,则自动调用默认构造函数
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[]字符串数组拷贝到存储空间中。因此也可以说明基类的构造函数先于派生类的构造函数执行。