1.1构造函数和析构函数
构造函数:
- 没有返回值,不用写void
- 函数名与类名相同
- 构造函数可以有参数,可以发生重载
- 创建对象的时候,构造函数会自动调用,而且只调用一次
class Person { Person() { cout<<"Person 构造函数的调用"<<endl; } ~Person() { cout<<"Person 析构函数的调用"<<endl; } } void test() { Person s;//在栈上的数据,test执行完毕后,释放这个对象 } int main() { test(); return 0; }
析构函数:
- 没有返回值,不用写void
- 函数名与类名相同 在名称前加~
- 构造函数不可以有参数的,不可以发生重载
- 创建对象的时候,构造函数会自动调用,而且只调用一次
1.2拷贝构造函数
class Person
{
Person()
{
cout<<"Person 构造函数的调用"<<endl;
}
Person(int a)
{
cout<<"Person 有参构造函数的调用"<<endl;
}
Person(const Person &p)
{
// 将传入的人身上的所有属性,拷贝到我身上
age=p.age;
cout<<"Person 构造函数的调用"<<endl;
}
~Person()
{
cout<<"Person 析构函数的调用"<<endl;
}
}
void test()
{
//1、括号法
Person p1;//默认构造函数
Person p2(10);//有参构造
Person p3(p2);//拷贝构造
//2、显示法
Person p1;
Person p2 =Person(10);//有参构造
Person p3 =Person(p2);//拷贝构造
Person(10);//匿名对象 特点:当前行执行结束后马上被系统回收
cout<<"aaaaa"<<endl;
//3、隐式转换法
Person p4 =10;//相当于写了Person p4=Person(10); 有参构造
Person p5 =p4;//拷贝构造
}
匿名对象的输出是先构造再析构,最后输出aaaaa
1.3 拷贝构造函数调用时机
值的方式返回也会调用拷贝构造函数
//值方式返回局部对象
Person doWork2()
{
Person p1;
cout<<(int *p1)<<endl;//打印的是p1的地址
return p1;/*return放回的是p1的克隆体(地址不一样了),doWork2接收到的是克隆体的数据,test03创建对象对象接收
doWork2的p1也是克隆数据*/
}
void test03()
{
Person p=doWork2();
cout<<(int *p1)<<endl;
}
两次打印的地址不同