构造函数和析构函数
构造函数是完成对象的初始化工作
析构函数是完成对象的清理工作
这两个函数也可以不写,但是编译器会帮我们实现,编译器提供一个空实现,
- 构造函数:在对象被创建的时候自动调用,一般完成变量的额初始化工作
- 析构函数:对象在被销毁之前,被调用,一般用来执行内存清理工作
- 构造函数可以有参数,因此可以发生重载,只会调用一次
- 析构函数不能有参数,因此不能发生重载, 只会调用一次
拷贝构造函数
拷贝构造函数形式
Persion::Persion(const Persion &p)
所谓的拷贝构造函数就是拷贝对象调用目标对象,拷贝对象获得参数对象的所有信息
无名对象的构造函数
Persion(10);
比如我们写了这么一句话,传入了一个参数10,如果说单纯的只有一个这个,对象名被隐藏了,会去调用他的有参构造函数,但是这句话执行完毕之后,因为他没有对象名,马上就会被销毁(马上会去执行析构函数),因为没名嘛
但是上边这段函数可以这么写:
Persion P1 = Persion(10);
如果这么写的话,无名对象就有名了,名字就是P1,相当于是P1去调用了一个有参构造函数,参数为10
不要用拷贝构造函数去初始化一个无名对象,为什么??
Persion(p3);
//正常的应该这么写,这叫调用拷贝构造函数;
Persion p4(p3);
看上边代码,这……是不是有点眼熟。。有点像
Persion p3;
这两句话没有区别,所以编译器会把你传入的拷贝参数当成你定义的变量,既然是拷贝构造,肯定会报P3重定义的小错误
隐式转换法:
直接上代码
Persion P3 = 10;
Persion P4 = P3;
这两行代码有点奇怪,一个类对象怎么能直接被整形变量赋值呢??
其实这两句代码没有错,执行相当于是这么写
Persion P3 = Persion(10);
Persion P4 = Persion(P3);
就是这样,相当于定义了无名对象,给无名对象起名叫P3,并且传入参数10,调用有参构造。
//下一行同理,参数传入P3,那肯定调用的就是拷贝构造函数了,然后给无名对象起了个名字叫P4。
上一行不对,这是对象的赋值会调用拷贝构造函数,不是无名对象