1、什么是构造函数与析构函数
简单来说,构造函数是对创建的数据进行初始化,析构函数是对象销毁前系统自动调用,执行一些清理工作。如果我们不提供构造函数和析构函数,编译器会提供,只是编译器提供的构造函数和析构函数是空实现。
2、语法
构造函数:类名() {}
-
构造函数,没有返回值也不写void
-
函数名称与类名相同
-
构造函数可以有参数,因此可以发生重载
-
程序在调用对象时会自动调用构造,无须手动调用,而且只会调用一次
-
构造函数有两种分类方式
-
按参分类——无参构造函数和有参构造函数
-
按类分类——普通构造函数和拷贝构造函数
-
-
三种调用方式: 括号法 、显示法、隐式转换法
析构函数:~类名() {}
-
析构函数,没有返回值也不写void
-
函数名称与类名相同,在名称前加上符号 ~
-
析构函数不可以有参数,因此不可以发生重载
-
程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
示例:
#include <iostream>
using namespace std;
#include <string>
class Character {
public:
//构造函数 类名() {}
Character() {
cout << "无参构造函数" << endl;
}
Character(string name) {
Name = name;
cout << "有参构造函数" << endl;
}
Character(const Character &p) {
Name = p.Name;
cout << "拷贝构造函数" << endl;
}
//析构函数 ~类名() {}
~Character() {
cout << "析构函数" << endl;
}
string Name;
};
void text01() {
Character first;//调用无参构造函数
system("pause");
} //函数执行后内部数据会被释放,故在释放数据之前会自动执行析构函数
void text02() {
Character second("胡桃");//调用有参构造函数
Character third(second);//调用拷贝构造函数
cout << second.Name << endl;
cout << third.Name << endl;
system("pause");
}//函数执行后内部数据会被释放,故在释放数据之前会自动执行析构函数
//三种创建方式 括号法 显式法 隐式转换法
void text03() {
// 括号法,常用
Character first;//无参
//注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明
Character second("胡桃");//有参
cout << second.Name << endl;
Character third(second);//拷贝函数
cout << third.Name << endl;
system("pause");
}
void text04() {
//显式法
Character first;//无参
Character second = Character("胡桃");//有参
cout << second.Name << endl;
Character third = Character(second);//拷贝函数
cout << third.Name << endl;
//Character("胡桃")单独写就是匿名对象 当前行结束之后,马上析构
system("pause");
}
void text05() {
//隐式转换法
Character first;//无参
Character second = "胡桃"; //有参
cout << second.Name << endl;
Character third = second;//拷贝函数
cout <<third.Name << endl;
//注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明
//Character third(second);
system("pause");
}
int main() {
text01();
text02();
text03();
text04();
text05();
system("pause");
return 0;
}