c++的构造函数

来源:互联网 发布:淘宝妈妈模特是谁 编辑:程序博客网 时间:2024/06/10 18:54

    1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

    3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

    4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

    5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

    6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:



针对第六点  自己的例子

#include<iostream> 

#include<string>
class Animal{
public:
std::string name;
Animal(std::string name);
~Animal();
};

class Turtle:public Animal{
public :
Turtle(std::string name);
~Turtle(); 
};
Animal::Animal(std::string name){
this->name=name;
std::cout<<"进入基类的有参构造函数"<<std::endl;
}
Animal::~Animal(){
std::cout<<"进入基类析构函数"<<std::endl;

Turtle::Turtle(std::string Name):Animal(Name){
std::cout<<"进入子类有一个参数的构造函数"<<std::endl;

Turtle::~Turtle(){
std::cout<<"进入子类的析构函数"<<std::endl;

int main(){
Turtle turtle("小甲鱼"); 
std::cout<<turtle.name<<std::endl;
return 0;
}


运行结果:


进入基类的有参构造函数
进入子类有一个参数的构造函数
小甲鱼
进入子类的析构函数
进入基类析构函数



针对第二和第五点  实例:

#include<iostream> 
#include<string>
class Animal{
public:
std::string name;
Animal();
Animal(std::string name);
~Animal();
};


class Turtle:public Animal{
public :
int age;
Turtle(std::string name); //定义了两个构造函数 
Turtle(std::string name,int age); 
~Turtle();
};
Animal::Animal(){
std::cout<<"进入基类的无参构造函数"<<std::endl;
}
Animal::Animal(std::string name){
this->name=name;
std::cout<<"进入基类的有参构造函数"<<std::endl;
}


Animal::~Animal(){
std::cout<<"进入基类析构函数"<<std::endl;



Turtle::Turtle(std::string Name):Animal(Name){
std::cout<<"进入子类有一个参数的构造函数"<<std::endl;

Turtle::Turtle(std::string name,int age){
this->name=name;
this->age=age;
std::cout<<"进入子类有两个参数的构造函数"<<std::endl;
}
Turtle::~Turtle(){
std::cout<<"进入子类的析构函数"<<std::endl;



int main(){
Turtle turtle("小甲鱼",20);
std::cout<<turtle.name<<" "<<turtle.age<<std::endl;
return 0;
}


运行结果:

进入基类的无参构造函数
进入子类有两个参数的构造函数
小甲鱼 20
进入子类的析构函数
进入基类析构函数


在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错。

如上例中Turtle类中定义的带两个参数的构造函数  如果父类的无参构造函数被注释掉,则程序会报错。

因此父类需要定义不带参数的构造函数,子类才能定义与父类参数不一致的构造方法。


0 0