C++面试题之模拟实现string类

本文探讨了C++面试中常见的string类实现,包括构造函数、拷贝构造函数、赋值运算符重载和析构函数。重点介绍了深拷贝、写时拷贝(引用计数)的概念,并提供了模拟实现string类的深拷贝示例代码,以解决浅拷贝带来的问题。
摘要由CSDN通过智能技术生成

  

         C++中的string类是一个很常见的面试题,string类里必须有的构造函数,拷贝构造,赋值运算符重载,析构函数等成员函数,下面看看是如何实现以及如何处理动态内存


拷贝构造的几种实现方法:

1.传统深拷贝

	//传统深拷贝
	String(const String& s)
		:_str(new char[strlen(s._str) + 1])    //深拷贝构造函数
	{
		strcpy(_str, s._str);
		cout << "String(const String& s)" << endl;
	}

如果不用引用计数的话,在这里只能用深拷贝

深浅拷贝问题连接:http://blog.csdn.net/dream_1996/article/details/61923747



2.现代方法拷贝

	//现代方式拷贝
	String(const String& s)     
		:_str(NULL)                  
	{                                
		String tmp(s._str);         
		std::swap(_str, tmp._str);
		cout<<"String(const String& s)"<<endl;
	}

这里不用给_str申请空间,直接把_str赋成空,然后用s._str构造一个tmp对象,把tmp和*this的_str的空间交换,这时tmp._str就指向空,而_str现在指向原来s._str的空间,在函数调用结束时tmp会自动释放


3.写时拷贝

   

	//写时拷贝
	String(const String& s)
		:_str(s._str)
		, _size(s._size)
	{
		++(*_size);
	} 
private:
	char *_str;
	int *_size;

    写时拷贝技术是通过"引用计数"实现的,因为浅拷贝的缺陷,所以在这个时候我们就引入了引用计数的拷贝。但是当其中一个对象改变它的值时,其他对象的值就会随之改变,所以此时我们采取这样一种做法,就是写时拷贝。写时拷贝

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值