构造函数语法:
类名()
{
}
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;
}