- 构造函数的分类:
- 按参数:
- 无参构造(默认构造)
- 有参构造
- 按类型:
- 普通构造
- 拷贝构造
- 按参数:
- 构造函数的调用:
- 括号法
- 显示法
- 隐式法
- 匿名对象创建
- 注意事项:
- 不要用 person p()调用无参构造,编译器会看成函数声明
- 不要用拷贝构造函数初始化 匿名对象,编译器会看成 对象的实例化,如果这个对象已经存在,会发生重定义错误
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class person
{
public:
//构造函数的分类
//1.按参数分:有参构造(默认构造函数)、无参构造
person()
{
cout << "调用无参构造函数" << endl;
}
person(int a)
{
cout << "调用有参构造函数" << endl;
}
//2.按类型分:普通构造函数、拷贝构造函数 除了拷贝构造函数外的构造函数都是普通构造函数
person(const person &a)//const是为了避免误操作更改原值,&引用是为了避免循环调用。
{
cout << "调用拷贝构造函数" << endl;
}
~person()
{
cout << "调用析构函数" << endl;
}
};
void test()
{
//构造函数的调用
//1.括号法
person p;//调用无参构造函数
person p1(10);//调用有参构造函数
person p2(p);//调用拷贝构造函数
//2.显示法
person p3 = person();//调用无参构造函数
person p4 = person(10);//调用有参构造函数
person p5 = person(p3);//调用拷贝构造函数
//3.隐式法
person p6 = 10;//调用有参构造函数
person p7 = p6;//调用拷贝构造函数
//匿名对象
person(10);//匿名对象执行完后,马上释放
//注意事项
//1.不能用person p()实例化对象,因为编译器会把person p()看成函数的声明
//2.不能用拷贝构造函数初始化 匿名对象:person (P3) ,编译器会认为这是p3的实例化,如果有p3,就会出现重定义错误
//析构函数,在栈上遵循 先进后出的原则
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
- 拷贝构造函数的调用时机:
- 初始化实例对象时
- 做为值传递参数时
- 作为值返回时
//拷贝构造函数的调用时机
//1.初始化对象是
void test02()
{
person p(10);
person p1 = person(p);//调用拷贝构造函数
}
//2.作为参数值传递时
void test03(person p)
{
}
void test04()
{
person p = 10;
test03(p);//因为是值传递,所以编译器会自动拷贝一份,此时也是拷贝构造函数的调用
}
//3.作为值返回时
person test05()
{
person p = 10;
return p; //当test05运行完毕,销毁堆栈,但P会被拷贝一份作为返回值传给主调函数,所以此时也会调用拷贝构造函数。
}