构造函数是对对象进行初始化的成员函数,构造函数的名字和类的名字是一样的,构造函数不用特定的调用,是在类实例化中,自动调用。构造函数可以有多个,也就是可以进行构造函数重载,实例化过程中会根据构造函数的参数类型、个数进行调用。析构函数和构造函数相反,是完成一些清理工作,比如释放内存或者其他的工作。析构函数不能重载,一个类只能有一个析构函数。
1.没有参数的构造函数
C++的类成员属性默认是私有的,如果想声明公有属性,要加上public:
#include<iostream>
using namespace std;
class Person//定义一个Person类
{
public:
Person();//构造函数放在公有属性中,不然不能实例化
~Person();
};
Person::Person()//构造函数
{
cout << "from Person" << endl;
}
Person::~Person()//析构函数
{
cout << "from ~Person" << endl;
}
int main()
{
Person p1;//实例化
return 0;
}
可见类的构造函数和析构函数是实例化类中进行调用的,没有参数的构造函数是隐式的,就是没有定义,在类的实例化中也会调用。
2.构造函数重载
构造函数支持重载,当类中属性需要初始化时,就可以通过构造函数对这些属性进行初始化,因为类是抽象的,在定义的时候属性不能赋值,只能在实例化中进行初始化。构造函数可以有多个,重载原则和函数重载是一样的。
#include<iostream>
using namespace std;
class Person
{
private://声明一些私有属性
int age;
int height;
public:
Person();
Person(int, int);//构造函数重载
void print_info();//声明一个打印类信息的函数
~Person();
};
Person::Person()
{
cout << "from Person" << endl;
}
Person::Person(int age,int height)
{
this->age = age;//this是隐含的指向类自己的指针
this->height = height;
}
void Person::print_info()
{
cout << "age=" << age << endl;
cout << "height=" << height << endl;
}
Person::~Person()
{
cout << "from ~Person" << endl;
}
int main()
{
Person p1;//实例化类会根据参数进行调用对应的构造函数
Person p2(20, 170);
p2.print_info();//调用公有方法
return 0;
}
由此可见,在实例化中,和函数的重载是一样的,会根据类的参数进行调用相应的构造函数对类进行实例化。如果调用p1的print_info()方法,你会看到是没有初始化的值,因为p1实例化中并没有传参。
this是指向对象自己的指针,通过this指向属性来区分相同名字的参数。