C++:构造函数的分类和调用、拷贝构造函数的调用时机

  1. 构造函数的分类:
    1. 按参数:
      1. 无参构造(默认构造)
      2. 有参构造
    2. 按类型:
      1. 普通构造
      2. 拷贝构造
  2. 构造函数的调用:
    1. 括号法
    2. 显示法
    3. 隐式法
  3. 匿名对象创建
  4. 注意事项:
    1. 不要用 person p()调用无参构造,编译器会看成函数声明
    2. 不要用拷贝构造函数初始化 匿名对象,编译器会看成 对象的实例化,如果这个对象已经存在,会发生重定义错误
#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. 拷贝构造函数的调用时机:
    1. 初始化实例对象时
    2. 做为值传递参数时
    3. 作为值返回时
//拷贝构造函数的调用时机
//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会被拷贝一份作为返回值传给主调函数,所以此时也会调用拷贝构造函数。
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值