#include<stdlib.h>
#include<iostream>
#include<string>
using namespace std;
/*
4.2 对象的初始化和清理
4.2.2 构造函数的分类及调用
按参数分:有参构造、无参构造(默认构造)
按类型分:普通构造、拷贝构造
调用方式3种:括号法、显式法、隐式转换法
*/
class Person{
public:
// 普通构造
Person(){
cout << "Person类 无参构造(默认构造)函数的调用" << endl;
}
Person(int a){
age = a;
cout << "Person类 有参构造函数的调用" << endl;
}
// 拷贝构造
Person(const Person & p){ // 有const和引用&
// 将传入的人身上的所有属性拷贝到我身上
age = p.age; // 区别上边普通构造的age = a
cout << "Person类 拷贝构造函数的调用" << endl;
}
// 析构函数
~Person(){
cout << "Person类析构函数的调用" << endl;
}
int age;
};
void test(){
// 1 括号法(常用)
Person p1; // 默认无参构造函数调用
Person p2(10); // 有参构造函数调用
Person p3(p2); // 拷贝构造函数调用
cout << "p2年龄:" << p2.age << endl;
cout << "p3年龄:" << p3.age << endl;
// 注意调用默认构造函数时不要加()
//Person p4(); // 虽不报错,但不会创建对象,所以不会调用任一构造和析构
// 编译器会认为上句是一个函数的声明
// 2 显式法
Person p5; // 无参默认构造
Person p6 = Person(10); // 有参构造
Person p7 = Person(p6); // 拷贝构造
// 匿名对象特点:当前行执行结束后,系统立即回收该匿名对象
Person(10); // 单独拿出来称为匿名对象
cout << "上行匿名对象的析构调用会自此句打印之前" << endl;
// 不要利用拷贝构造函数来初始化匿名对象
//Person(p7); // 报错,编译器会认为你的Person(p7)是Person p7(即无参默认构造,与上述p7重定义了)
// 3 隐式转换法(会被自动转换为显式法)
Person p8 = 10; // 有参构造 等价于Person p8=Person(10);
Person p9 = p8; // 拷贝构造 等价于Person p9=Person(p8);
}
int main(){
test();
system("pause");
return 0;
}
![](https://img-blog.csdnimg.cn/20210314205709826.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hBSUZFSTY2Ng==,size_16,color_FFFFFF,t_70)