c++浅拷贝,深拷贝

#include<iostream>
#include<string>

class string
{
private:
	char* m_buffer;
	unsigned int m_size;
public:
	string(const char* string)
	{
		m_size = strlen(string);
		//m_buffer = new char[m_size];
		//memcpy(m_buffer, string, m_size );没有添加终止符错误示范
		m_buffer = new char[m_size + 1];
		memcpy(m_buffer, string, m_size + 1);//带入终止字符
		//m_buffer[m_size] = 0;同添加终止符同一类操作
	}
	string(const string& other)
		:m_size(other.m_size)
	{
		std::cout << "copied string" << std::endl;
		m_buffer = new char[m_size + 1];
		memcpy(m_buffer, other.m_buffer, m_size+1);
	}
	~string()
	{
		delete[]m_buffer;
	}
	char& operator[](unsigned int index)
	{
		return m_buffer[index];
	}

	friend std::ostream& operator << (std::ostream& stream, const string& string);//借用友元来访问类的私有成员
};

std::ostream& operator << (std::ostream& stream, const string& string)
{
	stream << string.m_buffer;
	return stream;
}
//深拷贝复制整个对象
void printstring(const string& string)
{
	std::cout << string << std::endl;
}

int main()
{
	string string1 = "cherno";
	string string2 = string1;//浅拷贝对象buffer内存地址相同程序崩溃,程序试图两次构析释放同一个模块空间
	string2[2] = 'a';

	printstring(string1);
	printstring(string2);
	std::cin.get();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值