构造函数分类
按照参数分类:无参构造(默认构造)和有参构造
按照类型分类:普通构造函数 拷贝构造函数//除了拷贝构造函数以外的都是普通构造函数
Person()
{
cout << "Person的默认构造函数调用" << endl;
}
Person(int age)
{
m_Age = age;
cout << "Person的有参构造函数调用" << endl;
}
//拷贝构造函数
Person(const Person &p )
{
cout << "Person拷贝构造函数调用" << endl;
m_Age = p.m_Age;
}
//如果值传递的话会已知无限进行拷贝构造函数,无限递归
构造函数的调用
0、无参构造
Person p;//无参构造
1、括号法
Person p1(10);
Person p2(p);//拷贝构造函数调用
注意事项一
不要用括号法 调用无参构造函数 Person p3(); //编译器会认为这是一个函数声明,返回值是Person
2、显式法
Person p3 = Person(10); //有参构造
Person p4 = Person(p3); //拷贝构造
栈上,先入后出,先p4析构,后p3析构
Person(10); //匿名对象 特点:当前行执行完后 立即释放
cout << "aaa" << endl;
栈上,先入后出,先匿名析构,然后打印aaa,然后p4析构,后p3析构
注意事项二
不要用拷贝构造函数 初始化 匿名对象 Person(p3):编译器认为Person p3对象实例化 如果已经有p3 p3就重定义
3、隐式法 隐式类型转换法
Person p5 = 10; //Person p5 = Person(10);
Person p6 = p5;
调用规则
1、编译器会给一个类 至少添加3个函数 默认构造(空实现) 析构函数(空实现) 拷贝构造(值拷贝)
2、如果我们自己提供了 有参构造函数,编译器就不会提供默认构造函数,我们就需要提供无参构造函数,或者是不要调用无参构造函数,但是编译器依然会提供拷贝构造函数
3、如果我们自己提供了 拷贝构造函数 编译器就不会提供其它构造函数。
初始化列表
//构造函数名称后 : 属性(值),属性(值)...
Person(int a, int b, int c) : m_A(a), m_B(b), m_C(c)
{
}