构造函数的分类及调用
两种分类方式:
按参数分类分为:有参构造和无参构造
按类型分类分为:普通构造和拷贝构造
三种调用方式
括号法
显示法
隐式转换法
匿名对象
特点:当前行执行结束后,系统会立即回收掉匿名对象
Person类:
class Person{
public:
//构造函数
Person(){
cout << "Person 无参构造函数的调用!" << endl;
}
Person(int a){
age = a;
cout << "Person 有参构造函数的调用!" << endl;
}
//拷贝构造函数
Person(const Person &p){
age = p.age ;//将传入的person的属性拷贝到我身上
cout << "Person的拷贝构造函数的调用!" << endl;
}
//析构函数
~Person(){
cout << "Person 析造函数的调用!" << endl;
}
int age;
};
测试:
Person(10); //匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象
cout << "aaaaa" << endl;
输出结果:
可以看到aaaaa在析构函数的调用之后,说明匿名函数在这一行之后立即释放
example
#include <iostream>
using namespace std;
//按照参数分类 有参构造(默认构造) 无参构造
//按照类型分类 普通构造 拷贝构造
class Person{
public:
//构造函数
Person(){
cout << "Person 无参构造函数的调用!" << endl;
}
Person(int a){
age = a;
cout << "Person 有参构造函数的调用!" << endl;
}
//拷贝构造函数
Person(const Person &p){
age = p.age ;//将传入的person的属性拷贝到我身上
cout << "Person的拷贝构造函数的调用!" << endl;
}
//析构函数
~Person(){
cout << "Person 析造函数的调用!" << endl;
}
int age;
};
//调用
void test01(){
// 1、括号法
// Person p1;//默认构造函数的调用
// Person p2(10);//有参构造函数的调用
// Person p3(p2); //拷贝构造函数的调用
//注意事项:调用默认构造函数的时候不要加()
//因为下面这一行代码,系统会认为是一个函数的声明,不会认为是在创建对象
// Person p1() ;
// cout << "p2的年龄为: " << p2.age << endl;
// cout << "p3的年龄为: " << p3.age << endl;
//2、显示法
Person p1;
Person p2=Person(10); //有参构造
Person p3=Person(p2); //拷贝构造
// Person(10); //匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象
// cout << "aaaaa" << endl;
//注意事项2:不要用拷贝构造函数来初始化匿名对象
//编译器会认为 Person(p3) == Person p3;
// Person(p3);
//3、隐式转换法
Person p4 = 10;//相当于写了 Person p4 = Person(10); //有参构造
Person p5 = p4;//拷贝构造函数的调用
}
int main(){
test01();
system("pause");
return 0;
}