c++拷贝函数

拷贝构造函数,显式与隐式拷贝构造函数用法如下:

#include "pointer.hpp"
#include <iostream>
using namespace std;


int main(int argc, const char *argv[])
{
	pointer p1(5,6);
	cout << "x:" << p1.getx() << " y:" << p1.gety() <<endl;
	cout << "-------------------" << endl;
	pointer p2(p1);//显示调用拷贝构造函数
	pointer p3 = p1;//隐士调用拷贝构造函数
	cout << "-------------------" << endl;
	pointer p4;
	p4 = p1;//没调用拷贝构造函数
	p4.show(p1);
	cout << "---------------" << endl;
	pointer p5 = test();
	//结果会输出一个默认构造函数输出和test,不会调用拷贝构造函数
	//通过编译选项可以把p5的地址传到test的p当中去
	//如果运行时候g++ xxx.cpp -fno-elide-constructors
	//强制调用拷贝构造函数
	//test不仅可以输出之前的结果还会输出两个拷贝构造函数的输出
	//return p的时候会产生一个临时对象,编译器经过优化不会
	//显示出来,出来加上面的编译选项,另外p5会接住也会输出拷贝函数
    pointer &p6 = p5;//不会调用拷贝构造函数i,只是多了个指向,并不是真正意义
	//的复制
	pointer *p7 = &p5;//也不会调用拷贝构造函数

	return 0;
}
#include "pointer.hpp"
#include <iostream>
using namespace std;


pointer::pointer()
{
	cout << "调用默认构造函数" << endl;
	x = 10;
	y = 10;
}

pointer::pointer(int _x,int _y):x(_x),y(_y)
{
	cout << "调用构造函数" << endl;
}
pointer::pointer(const pointer &other) : x(other.x),y(other.y)
{
	cout << "调用拷贝构造函数 " << endl;
}
int pointer::getx()
{
	return x;
}

int pointer::gety()
{
	return y;
}

void pointer::setxy(int _x,int _y)
{
	x = _x;
	y = _y;
}
void pointer::show(pointer other)
{
	cout << "show" << other.x << " " << other.y <<endl;
}

pointer test()
{
	pointer p;
	cout << "test" << endl;
	return p;//这里编译器会优化,不加编译选项强制输出拷贝构造函数的话结果只会输出test

}




#ifndef POINTER_HPP
#define POINTER_HPP

#include <iostream>


class pointer
{
	public:
		pointer();
		pointer(int _x,int _y);
		pointer(const pointer &other);//拷贝构造函数声明
		int getx();
		int gety();
		void setxy(int _x,int _y);
		void show(pointer other);

	private:
		int x;
		int y;
};

pointer test();



#endif

C++中,拷贝函数(Copy Constructor)是一个特殊的构造函数,用于创建一个新的对象,新对象的内容完全复制自另一个已存在的对象。其作用通常是在不需要修改源对象的情况下,对源对象进行浅复制。拷贝构造函数的基本形式如下: ```cpp class ClassName { private: // 数据成员... public: // 构造函数 ClassName() {} // 默认构造函数 ClassName(const ClassName& obj) { // 拷贝构造函数 // 复制数据成员到新的对象 dataMember1 = obj.dataMember1; dataMember2 = obj.dataMember2; // ... 其他成员的复制操作 } // 其他成员函数... // 拷贝赋值运算符 (optional) ClassName& operator=(const ClassName& obj) { if (this != &obj) { // 防止自我赋值 dataMember1 = obj.dataMember1; dataMember2 = obj.dataMember2; // ... 其他成员的赋值操作 } return *this; } }; ``` 当你想要创建一个`ClassName`类的对象,并希望它的状态和已有对象一致时,可以这样做: ```cpp ClassName source; // 创建第一个对象 source.setData(); // 设置初始数据 ClassName copy(source); // 使用拷贝构造函数创建第二个对象,内容与source相同 ``` 拷贝构造函数对于管理对象的副本非常有用,例如在容器(如vector、list等)中存储对象时,它们会自动调用拷贝构造函数来填充内部元素。 如果你想要进行深度复制(Clone),特别是在处理自定义对象或涉及资源分配的情况下,可能需要额外编写代码来实现。拷贝构造函数仅负责简单数据类型的浅拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值