一、构造函数和析构函数
解决对象的初始化和清理问题
** 程序员自己不写以上两个函数,编译器会自动提供以上两个函数 但是内部实现内容为空 **
①构造函数:用于创建对象时为对象成员属性赋值,由编译器自动调用,无需手动调用
语法:类名(){ }
1、构造函数不需要有返回值,也不写void
2、函数名与类名相同
3、构造函数可以有参数,可以重载
4、程序调用对象时会自动调用构造,只会调用一次
②析构函数:用于对象销毁前的清理工作
语法:~类名(){ }
1、析构函数不需要有返回值,也不写void
2、函数名与类名相同,在名称前加 ~
3、构造函数不可以有参数,不可以重载
4、程序对象销毁前会自动调用构造,只会调用一次
二、构造函数的分类及调用
按参数分为:有参构造和无参构造
class Person
{
public:
Person()
{
cout << "无参构造/默认构造" << endl;
}
Person(int a)
{
cout << "有参构造" << endl;
}
}
按类型分为:普通构造和拷贝构造
class Person
{
public:
Person()
{
cout << "无参构造/默认构造" << endl;
}
Person(int a)
{
age = a;
cout << "有参构造" << endl;
}
//1、将传入(用引用方式)人的复制一份 构造一个新的人
//2、const保证传入的数据不被修改
Person(const Person &p)
{
age = p.age;
cout << "拷贝构造" << endl;
}
~Person()
{
cout << "析构函数" << endl;
}
private:
int a;
}
调用方式:括号法、显示法、隐式转换法
void test()
{
// 1、括号法
Person p1; //默认构造函数的调用
Person p2(10);//有参构造函数
Person p3(p2);//拷贝构造函数
//注意事项:调用默认构造函数的时候不要加(),因为编译器会认为这是一个函数的声明
//2、显示法
Person p1; //默认构造函数的调用
Person p2 = Person(10);//有参构造函数,有名
Person p3 = Person(p2);//拷贝构造函数,有名
Person(10);//匿名对象
//匿名对象的特点:当前行执行结束后,系统会立即回收匿名对象
//注意事项:不要利用拷贝构造函数 初始化匿名对象。
//编译器会认为Person(p3)=== Person p3的对象声明
//3、隐式转换法
Person p4 = 10; // 相当于 Person p4 = Person(10)有参构造
Person p5 = p4;//拷贝构造
}
三、构造函数的调用规则
默认情况下c++编译器至少给一个类添加三个函数
1、默认构造函数(无参、函数体为空)
2、默认析构函数(无参、函数体为空)
3、默认拷贝构造函数,对属性进行值拷贝
构造函数的调用规则:
1、如果用户定义有参构造函数,系统不再提供默认无参构造函数,但是依旧会提供默认拷贝构造函数
2、如果用户定义拷贝构造函数,系统不再提供其他构造函数