目录
两种分类方式:
1.按照参数分类:无参构造(默认类型)、有参构造
2.按照类型分类:普通构造、拷贝构造
拷贝构造的参数格式:const class& classs
拷贝构造函数的三种使用场景:
1.使用一个已经创建好的对象来初始化新对象
2.值传递给函数参数传参
3.以值方式返回局部对象
#include <iostream>
using namespace std;
class persion
{
private:
int m_age;
public:
//无参构造
persion()
{
cout << "无参函数的调用" << endl;
}
//有参构造
persion(int age)
{
m_age = age;
cout << "有参函数的调用" << endl;
}
//以上两种都属于普通构造
//拷贝构造:将一个同类型的类数据拷贝至该变量
persion(const persion& persionn) //拷贝的同时要按照引用的方式传递进来
{
cout << "构造拷贝函数" << endl;
m_age = persionn.m_age;
}
int get_persion()
{
return m_age;
}
~persion()
{
cout << "析构函数被调用" << endl;
}
};
三种调用方式:
1.括号法
在实例化对象的时候,顺带着调用构造函数了
调用无参构造函数时,无需加括号,否则会被编译为函数声明!!!
2.显示法
匿名对象在当前行被创建,在当前行执行完以后,立马释放该匿名对象
有弹幕说:匿名对象可以做函数参数使用,按照引用方式传参时,要加const
不要利用拷贝构造函数初始化匿名对象!!!,否则报错重复定义
3.隐式转换法
与显示法类似,只是把persion给省略了
int main()
{
persion persion_test(2);
//1.括号法
persion persion0; //无参调用时无需加括号
persion persion1(1); //记得将构造函数的属性设置为公有属性
cout << "persion1的年龄->" << persion1.get_persion() << endl;
persion persion2(persion_test);
cout << "persion2的年龄->" << persion2.get_persion() << endl;
//2.显示法
persion persion3;
persion persion4 = persion(4);
cout << "persion4的年龄->" << persion4.get_persion() << endl;
persion persion5 = persion(persion_test);
cout << "persion5的年龄->" << persion5.get_persion() << endl;
persion(10); //匿名对象
//3.隐式转换法
persion persion7 = 7;
cout << "persion7的年龄->" << persion7.get_persion() << endl;
persion persion8 = persion_test;
cout << "persion8的年龄->" << persion8.get_persion() << endl;
system("pause");
return 0;
}
构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数:
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下:
1.如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造函数
2.如果用户定义默认拷贝构造函数,C++不再提供其他构造函数