对象的初始化和清理
C++中面向的对象来源于生活,每个对象也都会有初始设置以及对象销毁前的清理数据的设置
构造函数和析构函数
如果我们不提供构造和析构,编译器会提供,编译器提供的构造函数和析构函数是空实现。
构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
构造函数语法: 类名(){}
构造函数,没有返回值也不写void
函数名与类名相同
构造函数可以有参数,因此可以发生重载
程序在调用对象时会自动调用构造,无需手动调用,而且只会调用一次
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
析构函数语法: ~类名(){}
析构函数,没有返回值也不写void
函数名与类名相同,在名称前加上~
析构函数不可以有参数,因此不可以发生重载
程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次
#include <iostream>
#include <string>
using namespace std;
class Person{
public:
Person(){
cout<<"Person构造函数的调用"<<endl;
}
~Person(){
cout<<"Person析构函数的调用"<<endl;
}
};
void test01(){
Person p;//在栈上的数据,test01执行完毕后,释放这个对象
}
int main(){
test01();
}
运行结果:
构造函数的分类及调用
两种分类方式:按参数 --有参构造和无参构造(默认构造)
按类型 --普通构造和拷贝构造
三种调用方式:括号法 显示法 隐式转换法
//拷贝构造函数
Person(const Person &p){
age=p.age;//将传入的人身上的所有属性拷贝到当前对象身上
}
//调用
void test01(){
//1.括号法
Person p1;
Person p2(10);
Person p3(p2);//拷贝构造函数调用
//**注意事项**//
//调用默认构造函数时候,不要加() 因为编译器会认为 Person p1() 是函数的声明
//2.显示法
Person p11;//无参
Person p22=Person(10);//有参
Person p33=Person(p22);//拷贝
Person(10);//匿名对象 当前行执行结束后,系统会立即回收掉匿名对象
//**注意事项**//
//不要利用拷贝利用函数 初始化匿名对象 编译器会认为Person (p3)===Person p3
//3.隐式转化法
Person p4=10;//相当于写了 Person p4=Person(10)
Person p5=p4;//拷贝构造
//Person p;//在栈上的数据,test01执行完毕后,释放这个对象
}
拷贝构造函数的调用时机:使用一个已经创建完毕的对象来初始化一个新对象
值传递的方式给函数参数传值
以值方式返回局部对象
默认情况下C++编译器至少给一个类添加三个函数:
默认构造函数(无参,结构体为空)
默认析构函数(无参,函数体为空)
默认拷贝构造函数,对属性进行值拷贝