C++ —— 构造函数和析构函数
引言
构造函数
和析构函数
是class
和C++
的struct
专属的功能(C
的struct
没有),用于管理对象的生命周期。
构造函数
:在创建对象
时,自动
的进行初始化
工作。
析构函数
:在销毁对象
前,自动
的完成清理
工作。
构造函数
- 访问权限必须是
public
; 函数名
必须与类名相同
;没有
返回值,不
写void
。- 可以有
参数
,可以重载
,可以有默认参数
; - 创建对象时只会
自动
调用一次
,不能
手工调用。
示例代码如下:
#include <iostream>
using namespace std;
class Car {
public:
string brand;
float acceleration;
Car() {cout << "Car constructor. ~ 1 ~" << endl;} // 无参构造
Car(string b) { // 一个参数的构造函数
brand = b;
cout << brand << " brand Car, constructor.~ 2 ~" << endl;
}
Car(string b, float a) { // 两个参数的构造函数
brand = b;
acceleration = a;
cout << brand << " brand Car, constructor.~ 3 ~" << endl;
cout << "Acceleration: " << acceleration << ".~ 3 ~" << endl;
}
};
int main() {
Car car1;
Car car2("Tesla");
Car car3("Porsche", 10.0);
return 0;
}
运行效果如下:
Car constructor. ~ 1 ~
Tesla brand Car, constructor.~ 2 ~
Porsche brand Car, constructor.~ 3 ~
Acceleration: 10.~ 3 ~
析构函数
- 访问权限必须是
public
; - 函数名必须在
类名前
加~
; 没有
返回值,也不
写void
;没有
参数,不能
重载;- 销毁对象前只会
自动
调用一次
,但是可以
手工调用。
在原class
的定义中加入代码:~Car() {cout << "Car destructor." << endl;} // 析构函数
即可。整体代码如下:
#include <iostream>
using namespace std;
class Car {
public:
string brand;
float acceleration;
Car() {cout << "Car constructor. ~ 1 ~" << endl;} // 无参构造
Car(string b) { // 一个参数的构造函数
brand = b;
cout << brand << " brand Car, constructor.~ 2 ~" << endl;
}
Car(string b, float a) { // 两个参数的构造函数
brand = b;
acceleration = a;
cout << brand << " brand Car, constructor.~ 3 ~" << endl;
cout << "Acceleration: " << acceleration << ".~ 3 ~" << endl;
}
~Car() {cout << "Car destructor." << endl;} // 析构函数
};
int main() {
Car car("Porsche", 3.6);
return 0;
}
运行结果如下:
Porsche brand Car, constructor.~ 3 ~
Acceleration: 3.6.~ 3 ~
Car destructor.
注意事项
- 如果
没有提供
构造/析构函数,编译器
将提供
空实现的构造/析构函数; - 如果
提供
了构造/析构函数,编译器
将不提供
空实现的构造/析构函数; - 创建对象的时候,如果重载了构造函数,编译器根据
实参匹配
相应的构造函数。没有参数
的构造函数也叫默认构造函数
; 创建
对象的时候不要
在对象名后面加空的圆括号
,编译器误认为是声明函数
。(没有构造函数、构造函数没有参数、构造函数的参数都有默认参数)- 在
构造函数名
后面加括号
和参数
不是调用构造函数,是创建匿名对象
; - 以下两种方法有本质的区别:
Car car1; // 创建对象
car1 = Car("Tesla_1"); // 创建匿名对象,然后给现有的对象赋值。
// 上面这种方法会调用两次构造和析构
// 下面这种方法会调用一次构造和析构
Car car2 = Car("Tesla_2"); // 显式创建对象
不建议
在构造/析构函数中写太多
的代码,可以调用成员函数;- 除了初始化,
不建议
让构造函数做太多
工作(只能成功不会失败)。 - 如果类的
成员
也是类
,创建
对象的时候,先
构造成员类
;销毁
对象的时候,先
析构成员类
。
感谢浏览,一起学习!
标签:函数,Car,brand,cout,C++,析构,和析构,构造函数 From: https://blog.csdn.net/MaoSiri/article/details/145036925