构造函数和析构函数
5、构造函数和析构函数
这两个函数将会被编译器自动调用,完成对象的初始化和清理工作。
编译器提供的构造和析构函数是空实现(即函数内容为空)。
构造函数:对象创建时为对象的成员属性赋值,由编译器自动调用。
析构函数:对象销毁前系统自动调用,执行一些清理工作。
构造函数语法:类名(){}
没有返回值也不写void,函数名称与类名相同,可以有参数,可以发生重载,程序调用时会自动调用,无需手动,且只会调用一次。
析构函数语法:~类名(){}
没有返回值也不写void,函数名称与类名相同,不可以有参数,不可以发生重载,程序调用时会自动调用,无需手动,且只会调用一次。
6、构造函数的分类及调用
1)分类
按参数:有参构造、无参构造
按类型:普通构造、拷贝构造( 语法:Person(const Person &p){} )
2)三种调用方式:
括号法(调用有参构造 Person p(10); )
显示法、
隐式转换法
Person p4=10;//相当于写了Person p4=Person(10); 有参构造
Person p5 = p4;//拷贝构造
注意事项:
1)在调用默认构造时,不要在后面加()。直接Person p1;
Person p1(); 编译器会认为这是一个函数声明,不会认为是在创建对象。
2)Person(10); 为匿名对象,特点:当前行执行结束后,编译器会对匿名对象进行马上回收。
注意不要利用拷贝构造函数来初始化一个匿名对象。编译器会认为Person(p3) = Person p3;
Person(p3);//错误
2月28日
1、拷贝构造函数的调用时机
1)使用一个已经创建完毕的对象来初始化另一个对象
2)值传递的方式给函数参数传值。
3)以值方式返回局部对象。
2、构造函数调用规则
1)若用户定义了有参构造函数,则c++不再提供默认构造,但会提供拷贝构造。
2)若用户定义了拷贝构造函数,则c++不再提供其他构造函数。
3、深拷贝与浅拷贝
深:在堆区重新申请空间,进行拷贝操作。
浅:简单的赋值拷贝操作。
如果利用编译器提供的拷贝构造函数,会做浅拷贝操作,浅拷贝带来的问题是会重复释放堆区的内存。浅拷贝带来的问题要用深拷贝解决。
解决方法:
做深拷贝
如果属性有在堆区重新开辟了内存,一定要做深拷贝构造函数,不然会造成内存重复释放。