- 构造函数的分类及调用
点击查看代码
#include<iostream>
#include<string>
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;
cout << "Person 拷贝构造函数的调用" << endl;
}
//析构函数
~Person()
{
cout << "Person 析构函数的调用" << endl;
}
int age;
};
//调用
void test01()
{
//1、括号法
Person p1; //默认构造函数的调用
Person p2(10); //有参构造函数的调用
Person p3(p2); //拷贝构造函数的调用
cout << "P2 的年龄为:" << p2.age << endl;
cout << "P3 的年龄为:" << p3.age << endl;
cout << "###############以上是括号法#################" << endl;
//注意事项
//调用默认构造函数时候,不要加()
//因为下面这行代码,编译器会认为是一个函数的声明,不会认为在创建对象
//Person p4(); //函数体的内部允许另一个函数声明!
//2、显式法
Person p5;
Person p6 = Person(11);//有参构造
Person p7 = Person(p6);//拷贝构造
Person(10);//匿名对象 特点:当本行执行结束后,系统会立即回收掉匿名对象
//注意事项
//不要利用拷贝构造函数初始化匿名对象编译器会认为 Person(p3) 就是Person p3
//Person(p3); //对象的声明,此处且重定义
cout << "###############以上是显式法#################" << endl;
//3、隐式转换法
Person p8 = 10; //相当于写了:Person p8 = Person(10);
Person p9 = p8; //拷贝构造
cout << "###############以上是隐式转换法#################" << endl;
}
int main(){
test01();
system("pause");
return 0;
}