• 构造函数的分类及调用

类和对象-对象特性-函数的分类以及调用_构造函数

 

类和对象-对象特性-函数的分类以及调用_显式_02

类和对象-对象特性-函数的分类以及调用_构造函数_03

点击查看代码
#include<iostream>
#include<string>

using namespace std;

//构造函数的分类及调用
//分类
//按照参数分类 无参构造(默认构造) 和 有参构造
//按照类型分类 普通构造            和 拷贝构造
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;
	}
	

	int age;
};

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

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

	cout << "###############以上是括号法#################" << endl;

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

		//Person p4(); //函数体的内部允许另一个函数声明!


	//2、显式法
	Person p5;
	Person p6 = Person(11);//有参构造
	Person p7 = Person(p6);//拷贝构造

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

		//注意事项
		//不要利用拷贝构造函数初始化匿名对象编译器会认为 Person(p3) 就是Person p3
			//Person(p3); //对象的声明,此处且重定义

	cout << "###############以上是显式法#################" << endl;


	//3、隐式转换法
	Person p8 = 10; //相当于写了:Person p8 = Person(10);
	Person p9 = p8; //拷贝构造

	cout << "###############以上是隐式转换法#################" << endl;
}

int main(){

	test01();
	

	system("pause");

	return 0;
}