构造函数
作用: 主要用来进行对象的初始化操作
需要注意的几个点:
- 函数名与类名相同
- 没有返回值 也不写void
- 构造函数可以有参数(有参构造函数),可以发生重载,也可以没有参数(默认构造函数)
- 创建对象的时候,构造函数会自动调用,而且只调用一次
下面的代码块,演示了构造函数如何进行对象的初始化
#include<iostream>
#include<string>
using namespace std;
class Car {
public:
//构造函数
Car(int price,string brand) {
m_Price = price;
m_Brand = brand;
cout << "Car构造函数调用 " << endl;
}
void display() {
cout << "车型是:" << m_Brand << " 价格是: " << m_Price << endl;
}
private:
int m_Price; //汽车价格
string m_Brand; //汽车品牌
};
void test() {
Car car(200000,"大众桑塔纳"); //栈上的数据,test执行完毕后 会释放这个对象 就会调用析构函数一次
car.display();
}
int main()
{
test();
system("pause");
return 0;
}
运行结果
说明
上面的代码中,我们声明了一个汽车Car类,并且拥有两个属性,分别是汽车价格m_Price,汽车品牌m_Brand,这里演示了构造函数的使用。
首先可以看到,函数名称与Car同名,这里采用了有参构造函数,方便给两个属性进行赋值。没有返回值,也没有写void。
其次,当我们在测试代码中声明一个Car类对象car的时候,就自动将汽车的两个属性进行了初始化,这一步也就是构造函数完成的工作,然后在后面调用了display方法,展示了汽车的属性。
析构函数
作用 : 主要用来进行对象的清理操作
需要注意的几个点:
- 函数名与类名相同,前面加一个~
- 没有返回值 也不写void
- 析构函数不可以有参数 不可以发生重载
- 对象在销毁前 会自动调用析构函数 而且只会调用一次
下面的代码块,演示了析构函数如何进行对象的清理
#include<iostream>
#include<string>
using namespace std;
class Car {
public:
//构造函数
Car(int price,string brand) {
m_Price = price;
m_Brand = brand;
cout << "Car构造函数调用 " << endl;
}
~Car() {
cout << "Car的析构函数调用 " << endl;
}
void display() {
cout << "车型是:" << m_Brand << " 价格是: " << m_Price << endl;
}
private:
int m_Price;
string m_Brand;
};
void test() {
Car car(200000,"大众桑塔纳"); //栈上的数据,test执行完毕后 会释放这个对象 就会调用析构函数一次
car.display();
}
int main()
{
test();
system("pause");
return 0;
}
运行结果
说明
还是上面的代码,只不过这一次添加了一个析构函数~Car,在函数中只打印了一句话,这样方便我们看到析构函数是否被调用了。
通过程序的运行结果可以看出,在没有添加析构函数的时候,系统也就是编译器本身其实是调用了其自身提供的析构函数,只不过我们看不到,在后台就直接完成了这个操作,当我们添加了析构函数代码时,就可以从最后的运行结果看到编译器调用了析构函数,进行了对象的清理操作
注意:
构造函数和析构函数都是必须有的 如果我们不实现 编译器会提供一个空实现的构造函数和析构函数