面试题:写一个string类

来源:互联网 发布:成都java培训机构学费 编辑:程序博客网 时间:2024/05/16 07:46

一个string类主要包括构造函数、析构函数、拷贝构造函数和赋值构造函数

(1)构造函数需要注意的是:当构造函数参数为空时,string类中为char* pdata成员,因此在初始化成员列表中需开辟一个字节的空间,并且赋初始值为‘\0’,因为在字符串是以'\0'结尾的,会占用一个字节;

当构造函数参数为字符串时,需注意字符串的长度计算方法为strlen(ptr)+1

(2)析构函数需要注意:需使用delete[] pdata;

(3)拷贝构造函数需要注意:参数为引用,即为值本身传递,否则会导致拷贝构造函数调用拷贝构造函数,造成无限递归。

(4)赋值构造函数需要注意:返回值为引用,以便满足像a = b = c这样的连锁赋值;   并且考虑异常安全性和自我赋值,采用copy &swap 方式

并且赋值构造函数需返回*this。具体可看effective C++


具体实现代码如下:


#ifndef _MY_STRING_H_#define _MY_STRING_H_#include <stdio.h>#include <string.h>class mystring_t{public://构造函数mystring_t() : m_pbuf(new char[1]){*m_pbuf = '\0';}mystring_t(const char *pbuf) : m_pbuf(new char[strlen(pbuf)+1]){if (m_pbuf){strcpy(m_pbuf, pbuf);}}//析构函数~mystring_t(){delete[] m_pbuf;m_pbuf = NULL;}//拷贝构造函数mystring_t(const mystring_t& other){mystring_t temp(other);//交换两者char *ptemp = temp.m_pbuf;temp.m_pbuf = m_pbuf;m_pbuf = ptemp;}//赋值构造函数mystring_t& operator=(const mystring_t &str){if (this != &str){mystring_t temp(str);//交换两者char *ptemp = temp.m_pbuf;temp.m_pbuf = m_pbuf;m_pbuf = ptemp;}return *this;}//第二种写法://赋值构造函数/*mystring_t& operator=(const mystring_t &str){if (this != &str){delete[] m_pbuf;m_pbuf = NULL;m_pbuf = new char[strlen(str.m_pbuf)+1];strcpy(m_pbuf,str.m_pbuf);}return *this;}*/private:char *m_pbuf;};#endif








0 0
原创粉丝点击