【C++】类和对象(四)

构造函数的分类以及调用

两种分类方式:

(1)按参数分为:有参构造(即:构造函数有参数)和无参构造(即:构造函数无参数,无参构造函数又叫默认构造

(2)按类型分为:普通构造和拷贝构造

三种调用方式:

(1)括号法(2)显示法(3)隐式转换法

(1)括号法

#include<iostream>
using namespace std;
class person
{
public:
	//无参构造函数
	person()
	{
		cout << "person的无参构造函数调用" << endl;
	}
	//有参构造函数
	person(int a)
	{
		cout << "person的有参构造函数调用" << endl;
		age = a;
	}
	//拷贝构造函数
	person(const person& p)
	{
		age = p.age;
		cout << "person的拷贝函数调用" << endl;
	}
	~person()
	{
		cout << "person的析构函数调用" << endl;
	}
	int age;
};
int main()
{
	//括号法
	person p1;//默认构造调用
	person p2(10);//有参构造函数调用
	person p3(p2);//拷贝构造函数
	cout << "p2的年龄为: " << p2.age << endl;
	cout << "p3的年龄为: " << p3.age << endl;


	return 0;
}

结果:

注意事项:调用默认构造函数时,不要加()

例如:

person  p1();

在一个函数体的内部,可以写另一个函数的声明,上述代码会被编译器认为是一个函数的声明。

(2)显示法

#include<iostream>
using namespace std;
class person
{
public:
	//无参构造函数
	person()
	{
		cout << "person的无参构造函数调用" << endl;
	}
	//有参构造函数
	person(int a)
	{
		cout << "person的有参构造函数调用" << endl;
		age = a;
	}
	//拷贝构造函数
	person(const person& p)
	{
		age = p.age;
		cout << "person的拷贝函数调用" << endl;
	}
	~person()
	{
		cout << "person的析构函数调用" << endl;
	}
	int age;
};
int main()
{
	//显示法
	person p4;//调用默认构造
	person p5 = person(11);//调用有参构造
	person p6 = person(p5);//调用拷贝构造
	
	



	return 0;
}

结果:

注意事项:

(1)

person(10);

该行代码称为匿名对象,匿名对象特点:当该行代码执行结束后,系统会立即回收掉匿名对象。

验证:

#include<iostream>
using namespace std;
class person
{
public:
	//无参构造函数
	person()
	{
		cout << "person的无参构造函数调用" << endl;
	}
	//有参构造函数
	person(int a)
	{
		cout << "person的有参构造函数调用" << endl;
		age = a;
	}
	//拷贝构造函数
	person(const person& p)
	{
		age = p.age;
		cout << "person的拷贝函数调用" << endl;
	}
	~person()
	{
		cout << "person的析构函数调用" << endl;
	}
	int age;
};
int main()
{
	//显示法
	//person p4;//调用默认构造
	//person p5 = person(11);//调用有参构造
	//person p6 = person(p5);//调用拷贝构造
	person(10);
	cout << "aahhahaa" << endl;
	return 0;
}

结果:

(2)不要利用拷贝构造函数初始化匿名对象。

person(p6);

因为编译器会认为是对象声明。编译器会认为:person(p6) ==perosn p6,会导致对象重定义,从而导致代码报错。

(3)隐式转换法

#include<iostream>
using namespace std;
class person
{
public:
	//无参构造函数
	person()
	{
		cout << "person的无参构造函数调用" << endl;
	}
	//有参构造函数
	person(int a)
	{
		cout << "person的有参构造函数调用" << endl;
		age = a;
	}
	//拷贝构造函数
	person(const person& p)
	{
		age = p.age;
		cout << "person的拷贝函数调用" << endl;
	}
	~person()
	{
		cout << "person的析构函数调用" << endl;
	}
	int age;
};
int main()
{
	//隐式转换法
	person  p7 = 10;//等价于:person  p7=person(10);
	person p8 = p7;
	return 0;
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值