实现一个string类

须要实现的基本功能:构造函数、拷贝构造函数、赋值函数、析构函数. (之前合称big three, 如今叫作copy control)html

  

 1 class String {
 2 public:
 3     String(const char* str = "");
 4     String(const String& rhs);
 5     ~String();
 6     String& operator=(const String& rhs);
 7     size_t size const();
 8     const char* c_str const();
 9 private:
10     char* data;
11 };
12 
13 /* 不简洁版本
14 String::String(const char* str) {
15     if (str == NULL) {
16         data = new char[1];
17         *data = '\0';
18     } else {
19         int len = strlen(str);
20         data = new char[len + 1];
21         strcpy(data, str);
22     }
23 }
24 */
25 
26 String::String(const char* str) {
27     data = new char[strlen(str) + 1];
28     strcpy(data, str);
29 }
30 
31 String::~String() {
32     delete[] data;
33 }
34 
35 String::String(const String& rhs) {
36     data = new char[rhs.size() + 1];
37     strcpy(data, rhs.c_str());
38 }
39 
40 // bad version
41 String& String::operator=(const String& rhs) {
42     if (this != &rhs) {
43         delete[] data;
44         data = new char[rhs.size() + 1];
45         strcpy(data, rhs.c_str());
46     }
47     return *this;
48 }
49 
50 size_t String::size() const{
51     return strlen(data);
52 }
53 
54 const char* String::c_str const() {
55     return data;
56 }

 

 

 改进版:【详情参考ref四、剑指offer第一题】c++

上面的拷贝构造函数有个潜在隐患:String类涉及到内存分配操做,这个new操做可能会抛出异常。shell

解决方法:安全

能够经过”copy and swap“的策略来实现。其原理很简单:即先对打算修改的对象作出一个副本(copy),在副本上作必要的修改。若是生成副本时出现任何异常,原对象依然能保证不变。若是修改为功,则经过不抛出任何异常的swap函数将副本和原对象进行交换(swap)。[ ref ]函数

1 String& String::operator=(const String &rhs) {
2     String tmp(rhs);
3     swap(data, tmp.data);
4     return *this;
5 }

若是把参数中的引用传递换成值传递,那就至关于自动建立出一个临时对象来。以下是另外一种等价形式。this

1 String& String::operator=(String rhs) {
2     swap(data, rhs.data);
3     return *this;
4 }

 

在swap以后,至关于两指针指向的内存区域进行了互换。当退出函数时,tmp生命周期已到,将被销毁,可是它销毁时释放的是交换后的内存区域,即原来的data所指的内存区域;它原本指向的内存区域如今归data管了,不会被释放。spa

 

ref2和ref5都考虑了异常安全的问题。.net

 

ref:设计

1. 《高质量C/C++程序设计指南》附录A,B (可能有错误)指针

2. http://coolshell.cn/articles/10478.html

3. http://noalgo.info/382.html

4. http://blog.csdn.net/worldwindjp/article/details/12967443

5. http://guochunyang.me/2014/10/17/c++-11-zhiyouzhi-yinyong--san---shiyong-c++-11-bianxie-string-lei-yiji--yichang-anquan--de--yunsuanfu/

相关文章
相关标签/搜索