c++ string的实现

来源:互联网 发布:淘宝网创始人有多少人 编辑:程序博客网 时间:2024/05/16 07:39

很多c++程序员定义一个字符串世喜欢用string而不是用char[],string调用方便,不需要考虑内存分配的情况,因为string是c++基于char[]建设出来的类,帮你把一些要自己用char[]完成的操作,变成了函数,直接调用函数就可以对字符串进行操作。string比char[]安全,具有自动调整大小的功能,不会发生下标越界,因此不必知道字符串大小。因此在不做底层对效率要求没有快捷性要求高时,建议用string。

那么string是怎么实现的呢?

首先实现一个最简单的只有构造函数,复制构造函数,复制操作符和析构函数的string类。

class String{public:String(const char *str = ""); //constructor functionString(const String &other);~String();String& operator=(const String &other);private:char *m_data;};

实现如下:

#include "String.h"#include <iostream>#include <STRING>using namespace std;String::String(const char *str){if (str==NULL){m_data = new char[1];*m_data = '\0';}else{int length = strlen(str);m_data = new char[length+1];//分配内存strcpy(m_data,str);//复制//cout<<"constructor fuction"<<endl;//测试}}String::~String(){delete[] m_data;//cout<<"destructor function"<<endl;//测试}String::String(const String &other){int length = strlen(other.m_data);m_data = new char[length+1];strcpy(m_data,other.m_data);//cout<<"copy construtor"<<endl;//测试}String& String::operator =(const String &other){//检查自赋值if (this == &other){return *this;}//释放原有的内存资源delete[] m_data;//分配新的内存资源,并复制内容int length = strlen(other.m_data);m_data = new char[length+1];strcpy(m_data,other.m_data);//cout<<"assignment operator"<<endl;//测试//返回本对象的引用return *this;}
这样只实现了基本的构造、复制、赋值、析构操作。还需要实现一些操作。

String operator+(const String &other)const;//operator+bool operator==(const String&);            //operator==char& operator[](unsigned int);            //operator[]size_t size(){return strlen(m_data);};    friend ostream& operator<<(ostream&,String&);char* getValue()   //用operator<<直接访问m_data.会报错。{return m_data;}

实现如下:

String String::operator +(const String &other)const{String newString;if (!other.m_data)newString = *this;else if(!m_data)newString = other;else{newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];strcpy(newString.m_data,m_data);strcat(newString.m_data,other.m_data);} // cout<<"operator+"<<endl;  //测试return newString;}bool String::operator ==(const String &s){if (strlen(s.m_data) != strlen(m_data))return false;return strcmp(m_data,s.m_data)?false:true;}char& String::operator [](unsigned int e){if (e>=0 && e<=strlen(m_data))return m_data[e];}ostream& operator<<(ostream& os,String& str){os<<str.getValue();return os;}


这样,就基本上完成了String类的实现。



好,那再问一个问题,在博客园看到过的  String s = "a" + "b",分配几次内存,调用几次构造函数。

首先,这个是错误的,在vc6.0显示错误:error C2110: cannot add two pointers
执行 cl.exe 时出错.

要把上面的语句改成String a = “a”,String s = a +“b“,这次呢?

这是对的。要分配4次内存,调用三次构造函数和一次复制构造函数。

“a”一次,”b”一次,”a”+”b”要分配一块新的内存。因为必须重新分配一块内存,来存储”ab”。即temp = “ab”,

   以上三次是必须,第四次分配内存发生在将a+b的值赋给s,即s=”ab”。


在每个函数内写测试,

测试类为

#include <iostream>#include "String.h"using namespace std;int main(){String a = "a";String s = a + "b";cout<<s<<endl;return 0;}

可以看到运行结果为:


三次构造函数是,一次是a,一次是b,这两次构造的时候分配内存,第三次是s,构造的时候并不分配内存,而是在,“operator+”的时候分配第三次,最后一次是“copy constructor”分配一次。共四次内存分配。

原创粉丝点击