构造函数语法:
类名()
{

}

1>. 构造函数,没有返回值也不写void。
2>. 函数名称与类名相同。
3>. 构造函数可以有参数的,因此是可以发生函数重载。
4>. 程序在调用对象时,会自动调用构造函数,无须手动调用,而且只会调用一次

析构函数语法:
~类名()
{

}

1>. 析构函数,没有返回值也不写void。
2>. 函数名称与类名相同,在名称前面加上~符号即可。
3>. 析构函数不可以有参数,因此不可以发生函数重载。
4>. 程序在对象销毁前会自动调用析构函数,无须手动调用,而且只会调用一次

构造函数两种分类方式:
按参数分为:有参构造与无参构造。
按类型分为:普通构造与拷贝构造。

三种调用方式:
括号法。
显示法。
隐式转换法。

#include <iostream>
using namespace std;

/*
两种分类方式:
按参数分为:有参构造与无参构造。
按类型分为:普通构造与拷贝构造。

三种调用方式:
括号法。
显示法。
隐式转换法。
*/

class Person{
public:
	//普通无参构造函数  --> 无参构造(默认构造)
	Person()
	{
		cout << "Person 无参构造函数调用" << endl;
	}

	//普通有参构造函数  --> 有参构造,一般就是用于初始化属性的值
	Person(int age)
	{
		m_Age = age;
		cout << "Person 有参构造函数调用" << endl;
	}

	//拷贝构造函数
	Person(const Person& p)  //将传入的参数p的所有属性拷贝到自己身上。
	{
		m_Age = p.m_Age;
		cout << "Person拷贝构造函数的调用" << endl;
	}

	~Person()
	{
		cout << "Person析构函数调用" << endl;
	}

	int m_Age;
};

int main(int argc,char *argv[])
{
	//1. 括号法。(最常用)
	//Person p1;     //调用无参构造函数
	//Person p2(10); //调用有参构造函数
	//Person p3(p2); //调用拷贝构造函数

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

	//cout << "p2的年龄:" << p2.m_Age << endl;
	//cout << "p3的年龄:" << p3.m_Age << endl;
	
	//2. 显示法。
	//Person p1;               //调用无参构造函数
	//Person p2 = Person(10);  //调用有参构造函数
	//Person p3 = Person(p2);  //调用拷贝构造函数

	//Person(10);   //这也是一个对象,只是没有名字而已。
				 //系统创建了这个名字的对象之后,赋值给Person p2
				 //这个对象就有名字,叫p2。
				 
				 //匿名对象特点:当前行执行结束之后,系统会立即回收掉匿名对象
	
	//cout << "aaa" << endl;
	//cout << "aaa" << endl; 
	//cout << "aaa" << endl;
	//cout << "aaa" << endl;
	//cout << "aaa" << endl;

	//cout << "p2的年龄:" << p2.m_Age << endl;
	//cout << "p3的年龄:" << p3.m_Age << endl;
	
	//3. 隐式转换法。
	Person p1;      //调用无参构造函数
	Person p2 = 10; //调用有参构造函数
	Person p3 = p2; //调用拷贝构造函数
	
	cout << "p2的年龄:" << p2.m_Age << endl;
	cout << "p3的年龄:" << p3.m_Age << endl;

	return 0;
}