类和对象-对象的初始化和清理-构造函数的分类及调用

两种分类方式:

按参数分为: 有参构造和无参构造
按类型分为: 普通构造和拷贝构造

三种调用方式:

括号法
显示法
隐式转换法

#include<iostream>
using namespace std;

//1、构造函数的分类及调用
//分类
//    按照参数分类	无参构造(默认构造) 和 有参构造
//    按照类型分类	普通构造 和 拷贝构造
class Person {
public:
	//构造函数
	Person() {
		cout << "Person的无参构造函数的调用" << endl;
	}

	Person(int a) {
		age = a;
		cout << "Person的有参构造函数的调用" << endl;
	}

	//拷贝构造函数
	Person(const Person& p/*这种格式目前只需要记住*/) {
		//将传入的人身上的所有属性,拷贝到我(定义的变量)身上
		age = p.age;
		cout << "Person的拷贝构造函数的调用" << endl;
	}

	~Person() {
		cout << "Person的析构函数的调用" << endl;
	}
private:
	int age;
};

//调用
void test01() {
	//1、括号法
	//Person p1;//默认构造函数的调用
	//Person p2(10);//有参构造函数的调用
	//Person p3(p2);//拷贝构造函数的调用,括号内是其他变量

	//注意事项
	//调用默认构造函数的时候,不要加()
	//因为下面这行代码,编译器会认为是一个函数的声明
	//Person p1();!!!默认构造函数的时候,不要加()


	//cout << "p2的年龄为:" << p2.age << endl;
	//cout << "p3的年龄为:" << p3.age << endl;

	//2、显示法
	//Person p1;
	//Person p2 = Person(10);//有参构造
	//Person p3 = Person(p2);//拷贝构造

	//注意事项1
	//Person(10);//匿名对象	特点:当前行执行结束后,系统会立即回收掉匿名对象
	//cout << "aaa" << endl;

	//注意事项2
	//不要利用拷贝函数 初始化匿名对象	编译器会认为 Person(p3) === Person p3;即 对象声明
	//Person(p3);

	//3、隐式转换法
	Person p4 = 10;//相当于 写了 Person p4 = Person (10);有参构造
	Person p5 = p4;//拷贝构造
}


int main() {

	test01();

	system("pause");

	return 0;
}

**

有参构造

Person(int a) {
		age = a;
		cout << "Person的有参构造函数的调用" << endl;
	}

无参构造

Person() {
		cout << "Person的无参构造函数的调用" << endl;
	}

普通构造

除了拷贝构造,其他均为普通构造,即有参构造和无参构造(默认构造)。

拷贝构造

Person(const Person& p/*这种格式目前只需要记住*/) {
		//将传入的人身上的所有属性,拷贝到我(定义的变量)身上
		age = p.age;
		cout << "Person的拷贝构造函数的调用" << endl;
	}

括号法调用的结果:

Person p1;//默认构造函数的调用
Person p2(10);//有参构造函数的调用
Person p3(p2);//拷贝构造函数的调用

括号法调用的结果

将Person p1 错写成 Person p1() 的运行结果:

Person p1();//默认构造函数的调用
Person p2(10);//有参构造函数的调用
Person p3(p2);//拷贝构造函数的调用

![在这里插入图片描述](https://img-blog.csdnimg.cn/1ff743825b0a4885bd328ef49ee6fe3e.png

无参函数消失,因为Person p1() 被编译器当作函数的声明。

**

显示法调用的结果

**

Person p1;
Person p2 = Person(10);//有参构造
Person p3 = Person(p2);//拷贝构造

 显示法调用的结果

-注意事项1:
匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象

Person(10);//匿名对象	特点:当前行执行结束后,系统会立即回收掉匿名对象
cout << "aaa" << endl;

匿名对象
析构函数结束后再打印aaa,说明匿名对象销毁掉了,再打印aaa

  • 注意事项2
    不要利用拷贝函数 初始化匿名对象 编译器会认为 Person(p3) === Person p3;即 对象声明
Person(p3);//Person(p3) === Person p3,即无参构造

拷贝函数初始化匿名对象
**

隐式转换法调用的结果:

**

Person p4 = 10;//相当于 写了 Person p4 = Person (10);有参构造
Person p5 = p4;//相当于 写了 Perodn p5 = Person (p4);拷贝构造

隐式转换法调用的结果
注:以后大概率会使用第一种方式!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值