构造函数和析构函数
对象的初始化和清理是两个非常重要的问题 一个对象或者变量没有初始状态问题很大 同样使用一个完整对象或变量,没有及时清理,也会造成一定安全问题
C++利用构造和析构函数解决上述问题,这两个函数由编译器自动调用,完成对象初始化和清理工作。 对象的初始化和析构是必须要做的,如果我们不提供,编译器会提供空实现(什么也没有)的构造和析构
- 构造函数:主要作用在于创建对象时为对象属性赋值,构造函数为编译器自动调用,无需手动调用
- 析构函数:主要作用在于对象销毁前自动调用,执行一些清理操作
class Person
{
public:
Person();
~Person();
};构造函数
类名(){/*body*/}
- 构造函数,没有返回值也不写void
- 函数名称与类名相同
- 构造函数可以有参数,因此可以发生重载
- 编译器自动调用,无需手动调用,而且只会调用一次
析构函数
~类名(){/*body*/}
- 析构函数,没有返回值也不写void
- 函数名称与类名相同,还要加一个符号~
- 析构函数不可以有参数,因此不可以发生重载
- 编译器自动调用,无需手动调用,而且只会调用一次
//from important
Person::Person()
{
cout << "Person构造函数调用" << endl;
}
Person::~Person()
{
cout << "Person析构函数调用" << endl;
}
int main()
{
Person p;
return 0;
//output:
//Person构造函数调用
//Person析构函数调用
//
}编译器默认类函数
title:Summary
collapse:open
1. 默认构造函数
2. 默认构造函数
3. 默认拷贝构造函数,对属性值拷贝(浅)
4. 赋值运算符operator=,对属性值拷贝(浅)函数分类以及调用
两种分类方式:
- 按参数分:有参无参构造
- 按类型分:普通拷贝构造
三种调用方式
class Person
{
public:
Person(){cout << "Person无参构造函数调用" << endl;}//普通
Person(int a){age = a; cout << "Person有参构造函数调用" << endl;}//有参
Person(const Person &p)
{this->age = p.age; cout << "Person拷贝构造函数调用" << endl;}//拷贝
~Person(){cout << "Person析构函数调用" << endl;}
int age;
};括号法
//from important
int main()
{
//默认调用
Person p1;
Person p2(10);
Person p3(p2);
/*output:
Person无参构造函数调用
Person有参构造函数调用
Person拷贝构造函数调用
Person析构函数调用
Person析构函数调用
Person析构函数调用
*/
}不要加括号,否则
//from important
int main()
{
Person p1();
// | |
//void func();
//调用默认构造函数时不加()
//因为这样编译器会认为是一个函数的声明,不会认为是在创建对象
}显示法
//from important
int main()
{
Person p1;
Person p2 = Person(10);
Person p3 = Person(p2);
/*output:
Person无参构造函数调用
Person有参构造函数调用
Person拷贝构造函数调用
Person析构函数调用
Person析构函数调用
Person析构函数调用
*/
}匿名对象:
//from important
int main()
{
//注意事项一
//这是一个匿名对象 特点:对象创建执行结束后,系统会立即回收掉匿名对象
Person(10);
cout << "Hello World" << endl;
/*output:
Person有参构造函数调用
Person析构函数调用
Hello World
*/
//注意事项二
//不要利用拷贝构造函数初始化匿名对象 编译器会认为Person(p3) == Person p3;对象声明,且不会析构
Person(p3);//错误
}隐式转换法(拷贝)
后面会有
//from important
int main()
{
Person p1 = 10;//Person p1 = Person(10);
Person p2 = p1;//Person p2 = Person(p1);
/*output:
Person有参构造函数调用
Person拷贝构造函数调用
Person析构函数调用
Person析构函数调用
*/
}