4.2对象的初始化和清理
4.2.1构造函数和析构函数
- 这两个函数由编译器自动调用。
- 如果我们不提供这两个,编译器会自动提供空的构造函数和析构函数。
构造函数:
类名(){}
- 没有返回值,不写void
- 函数名和类名相同
- 可以有参数,发生重载。
- 会自动调用
析构函数:
~类名(){}
- 析构函数不可以有参数,不能发生重载。
- 对象销毁前会自动调用。
#include <iostream>
using namespace std;
class person
{
public:
person ()
{
cout<<"构造函数"<<endl;
}
~person()
{
cout<<"析构函数"<<endl;
}
};
void test1()
{
person p;//局部对象,在栈上,执行完会自动释放,释放前会调用析构函数
}
int main() {
//test1();
person p;
}
4.2.2构造函数的分类和调用
分类:
- 按参数:有参构造,无参构造。
- 按类型:普通构造和拷贝构造
三种调用方式:
括号法(常用)
显示法
隐式转换法
#include <iostream>
using namespace std;
class person
{
public:
person ()
{
cout<<"无参构造函数"<<endl;
}
person (int a)
{
age=a;
cout<<"有参构造函数"<<endl;
}
person (const person &p)//拷贝构造
{
age=p.age;
cout<<"拷贝构造函数"<<endl;
}
~person()
{
cout<<"析构函数"<<endl;
}
int age;
};
void test1()
{
//括号法
// person p1;
// person p2(10);
// person p3(p2);
//显示法
person p1;
person p2=person(10);
person p3=person(p2);
//person(10);//匿名对象,这句执行后会马上回收。
//person(p3);//编译器会认为person(p3)==person p3
//隐式转换法
person p4 =10;
person p5 =p4;
}
int main (){
test1();
}
4.2.3拷贝构造函数的调用时机
- 使用一个已经创建完毕的对象来初始化一个新对象。
- 值传递的方式给函数的参数传值
- 以值方式返回局部对象