C++中可以给类提供很多重载的构造函数,首先,如果没有构造函数,将有一个默认的无参的构造函数
1.默认的构造函数
class Person
{
public:
const std::string & getName() const;
const int getAge() const;
void display() const;
virtual ~Person();
private:
std::string name;
int age;
};
void Person::display() const
{
std::cout<<"name: "<<name<<std::endl;
std::cout<<"age: "<<age<<std::endl;
}
Person::~Person()
{
std::cout<<"Destructor ~Person() is called"<<std::endl;
}
int main()
{
Person p;
p.display();
return 0;
}
这个函数由于没有构造函数,那么在定义Person的时候会调用默认的无参的构造函数,这个默认的函数实际上函数体为空,也就是什么都不敢干。所以实际没有对成员变量进行初始化,所以输出是:
name:
age: 4310286
Destructor ~Person() is called
当类的定义中有了构造函数时,不会再提供默认的构造函数了,修改类的定义如下
class Person
{
public:
Person();
void display() const;
virtual ~Person();
private:
std::string name;
int age;
};
Person::Person()
{
std::cout<<"Constructor Person() is called"<<std::endl;
}
void Person::display() const
{
std::cout<<"name: "<<name<<std::endl;
std::cout<<"age: "<<age<<std::endl;
}
Person::~Person()
{
std::cout<<"Destructor ~Person() is called"<<std::endl;
}
主函数不变,这个时候由于类定义了自己的无参的构造函数,所以这个时候会调用类中自己定义的无参的构造函数,输出如下:
Constructor Person() is called
name:
age: 4310478
Destructor ~Person() is called
下面增加定义一个带参数的构造函数对成员变量进行初始化
Person::Person(const std::string &t_name, int t_age)
{
this->name = t_name;
this->age = t_age;
std::cout<<"Constructor Person(const std::string &t_name, int t_age) is called"<<std::endl;
}
修改主函数的对象定义
Person p("Kobe", 40);
这个时候用了两个参数来定义一个对象,所以这个时候会调用Person类的带这两个类型参数的构造函数。输出如下:
Constructor Person(const std::string &t_name, int t_age) is called
name: Kobe
age: 40
Destructor ~Person() is called
那么现在好奇上面没有构造函数的时候会默认一个函数体为空的构造函数,那么如果现在这里只有带参数的构造函数,那么会不会有一个这样的默认的构造函数呢?那么修改类的定义。将之前自己定义的无参的构造函数注释,并将对象的定义回到:
Person p;
这个时候编译报错
error: no matching function for call to 'Person::Person()'
所以我们可以确定,在类没有定义自己的构造函数的时候,那么会提供一个默认的函数体为空的无参构造函数。一旦类的定义提供了构造函数,不管有没有参数,那么将不再提供默认构造函数了。