模拟实现C++ string类(构造、析构、拷贝、赋值运算符重载)
来源:互联网 发布:局域网映射网络驱动器 编辑:程序博客网 时间:2024/05/17 06:10
在面试过程中,如果要让写一个string类的模拟,那么,面试官多半是想考你关于深浅拷贝的某些知识。
对于string类的实现来说,比较重要的几个成员函数,也就是构造函数、析构函数、拷贝构造函数、赋值运算符重载等等,再次,我只先实现这几个。其中拷贝构造和赋值运算符的重载有其他方法,我将在后边附上写出来。
废话不多,直接上程序:
<pre name="code" class="cpp">class String{public:char* _pstr;public:String(char* pstr="")//构造函数{if (pstr == NULL){ _pstr = new char[1];*_pstr = '\0';}else{_pstr = new char[strlen(pstr) + 1];strcpy(_pstr,pstr);}}String(const String&s)//拷贝构造函数{_pstr = new char[strlen(s._pstr) + 1];strcpy(_pstr, s._pstr);}~String()//析构函数{if (_pstr){delete[] _pstr;}}String& operator = (const String& s)//赋值运算符重载{if (this != &s){char *pstr = new char[strlen(s._pstr) + 1];strcpy(pstr, s._pstr);delete[] _pstr;_pstr = pstr;}return *this;}
<pre name="code" class="cpp">int main(){String s1("hallo world");cout << s1._pstr << endl;String s2(s1);cout << s2._pstr << endl;String s3 ;s3 = s2;cout << s3._pstr << endl;return 0;}
对于拷贝构造函数和赋值运算符的重载还有其他方法来实现。
拷贝构造:
String(const String &s)//拷贝构造:_pstr(NULL){String strTemp(s._pstr);std::swap(_pstr, strTemp._pstr);cout << "this is copy " << this << endl;}(1) 以上拷贝构造函数先在函数内部用构造函数构造了一个局部对象strTemp,其中strTemp的_pstr的指向用参数S的_pstr构造。
(2)再利用swap函数将strTemp的_pstr与要构造的对象(this)的_pstr进行交换,由于之前已经给(this)的_pstr赋空,所以交换之后,strTemp的_pstr为NULL。
(3)拷贝构造函数调用完之后会析构strTemp对象。
赋值运算符重载:
String& operator =( String s)//赋值运算符重载一{std::swap(_pstr, s._pstr);return *this;}String& operator =(const String &s)//赋值运算符重载二{if (this != &s){String strTemp(s);std::swap(_pstr, strTemp._pstr);}return *this;}
上边两种赋值运算符重载的方式其实大同小异,都是利用了建立新对象和swap交换函数。
(1)重载一中,在传参的时候,是复制了一份临时变量(对象)s,利用s的_pstr和被赋值对象(this)的_pstr进行交换,使得被赋值对象(this)的_pstr指向s._pstr,而s.pstr指向原本this._pstr的指向。
(2)重载二中,参数是利用引用的,但在函数内部,还是创建了对象strTemp,再利用交换函数,得到正确的指向。
1 0
- 模拟实现C++ string类(构造、析构、拷贝、赋值运算符重载)
- 实现字符串类String的设计,实现赋值运算符重载函数,默认、一般、拷贝构造函数,析构函数
- String类的构造函数、析构函数、拷贝构造函数、赋值运算符重载
- C++读书笔记——拷贝构造函数,赋值运算符重载函数,转换构造函数(String类)
- [C++]拷贝构造函数和赋值运算符重载
- 拷贝构造&&赋值运算符重载
- 拷贝构造函数/重载赋值运算符
- 类的赋值运算符重载和拷贝构造函数
- 类模板以及赋值运算符重载、拷贝构造函数
- 日期类的实现(其中包括构造函数,拷贝构造,赋值运算符重载,输出运算符重载,友元函数等等)
- 什么时候需要重载拷贝构造函数(赋值运算符)!
- 拷贝构造与赋值运算符重载(顺序)
- C++面试题,自己实现String类的构造函数,拷贝构造函数,赋值操作符,append,replace,+运算符重载等
- c++ 实现动态顺序表(拷贝构造 赋值运算符重载等操作)
- c++ 实现动态顺序表(拷贝构造 赋值运算符重载等操作)
- C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现
- C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现
- C++ 类的深拷贝与浅拷贝||深拷贝通过重载拷贝构造函数与重载赋值运算符实现
- SQL 时间差问题
- vmware设置桥接时复制物理网络连接状态是什么意思?
- (尺取法)Codeforces 676C - Vasya and String
- Unity操作篇(2)创建基本3D游戏场景
- Android入门:广播发送者与广播接收者
- 模拟实现C++ string类(构造、析构、拷贝、赋值运算符重载)
- OGNL使用详解
- 纯css3设计下拉菜单
- Android studio常见的问题及常见快捷键
- caffe框架在添加自己的MFC程序(上)
- 初学C语言基础整理
- 长单词处理
- editbox
- 获取应用代理实例