构造函数,按照参数类型分为有参构造和无参构造两种;按照类型分类为普通构造和拷贝构造两种;无参构造又称为默认构造函数例如:
class Person
{
public:
//无参构造函数或默认构造函数
Person()
{
cout << "person无参构造函数的调用" << endl;
}
~Person()
{
cout << "person析构函数的调用" << endl;
}
//有参构造函数
Person(int a)
{
int age = a;
cout << "person有参构造函数的调用" << endl;
}
//拷贝构造函数
Person(const Person &p)
{
age = p.age;
cout << "person拷贝构造函数的调用" << endl;
}
int age = 0;
};
函数调用的方法,包括括号法,显示法以及隐式调用法,如下:
void test()
{
//括号法
//调用默认构造函数时,不要加小括号,否则会认为是函数声明;
Person p;//默认构造函数的调用
Person p2(10);//调用有参构造函数
Person p3(p2);//调用拷贝构造函数
cout << "p2的年龄为" << p2.age << endl;
cout << "p3的年龄为" << p3.age << endl;
}
1、括号法运行结果如下:
2、显示法如下:
//显示法
Person p;//调用默认构造
Person p2 = Person(10); // 调用有参构造
Person p3 = Person(p2);//调用拷贝构造
//不要利用拷贝构造函数初始化匿名对象,等价于Person(p3) = Person p3,会认为是一个对象的声明;
//Person(10);//匿名对象 当前行执行结束后,系统立即回收匿名对象
cout << "p2的年龄为" << p2.age << endl;
cout << "p3的年龄为" << p3.age << endl;
运行结果:
需要注意的是,匿名对象,在该行代码执行完毕后,会立即收回匿名对象,就是说调用完该构造函数后,会立即调用析构函数;不能利用拷贝构造函数初始化匿名对象,编译器会任务是一个对象声明;
3、隐式转换法如下