暑期C++之 copy构造函数调用时机

拷贝构造函数在构造函数中是一个很重要的部分,很多初学者对于拷贝构造函数的调用时机不太清楚。

今天就把代码贴上来,让大家了解拷贝构造函数调用场景

场景1

#pragma once
#include<iostream>
using namespace std;

class Location1
{
private:
	int x, y;

public:
	Location1(int x = 0, int y = 0)
	{
		this->x = x;
		this->y = y;
		cout << "构造函数被调用" << endl;
	}

	Location1(const Location1 &obj)
	{
		cout << "copy" << endl;
		x = obj.x;
		y = obj.y;
	}

	~Location1()
	{
		cout << x << "x" << y << "y" << endl;
	}

	int getx() { return x; }   int gety() { return y; }
};

void f1(Location1 p)
{
	cout << p.getx() << "x" << p.gety() << "y" << endl;
}

void playobj1()
{
	Location1 a(1, 2);
	Location1 b = a;

	f1(b);		//b实参会初始化形参p  会调用copy构造函数

}

int main04()
{
	playobj1();
	
	return 0;
}




场景2

#pragma once
#include<iostream>
using namespace std;

class Location
{
private:
	int x, y;

public:
	Location(int x, int y )
	{
		this->x = x;
		this->y = y;
		cout << "构造函数被调用" << endl;
	}

	Location(int y )
	{
		this->x = 100;
		this->y = y;
		cout << "一个参数函数被调用" << endl;
	}

	Location(const Location &obj)
	{
		cout << "copy" << endl;
		x = obj.x;
		y = obj.y;
	}

	~Location()
	{
		cout << x << "x" << y << "y" << endl;
	}

	int getx() { return x; }   int gety() { return y; }
};

//结论:函数返回值是一个元素  返回的是一个新的元素,所以会调用匿名对象类的拷贝构造函数
//匿名对象的 去和留
//如果用匿名对象   初始化另外一个同类型对象  匿名对象转变有名对象
//如果用匿名对象   赋值给另一个同类型对象    匿名对象立马析构
Location g()
{
	Location a(1, 2);
	return a;				//返回一个元素 所以这里会调用拷贝构造函数
							//用a对象创建一个匿名对象,然后把原来的对象给析构
}

//
void playobj()
{
	g();
}

void playobj2()
{
	//用匿名对象初始化M 此时匿名对象就变成m  从无名变成有名
	//提前牺牲内存 来提高运行速度
	Location m = g();
	cout << m.getx() << endl;
}

void playobj3()
{
	Location m2(8);
	m2 = g();					//用匿名对象给其他对象 赋值  所以匿名对象被析构 
	cout << m2.getx();

}

int main()
{
	//playobj();
	//playobj2();
	playobj3();

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值