实现string类

文章目录
  1. 1. 参考资料
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class String
{
public:
String()
:data_(new char[1])
{
*data_ = '\0';
}
String(const char& str)
:data_(new char[strlen(str) + 1])
{
strcpy(data_, str);
}
String(const String& rhs)
:data_(new char[rhs.size() + 1])
{
strcpy(data_, rhs.c_str());
}
~String()
{
delete[] data_;
}
/* traditional
String& operator=(const String& rhs)
{
String tmp(rhs);
swap(tmp);
return *this
}*/

String& operator=(String rhs)
{
swap(rhs);
return *this;
}


// C++ 11
String(String&& rhs)
: data_(rhs.data_)
{
rhs.data_ = nullptr;
}

String& operator=(String&& rhs)
{
swap(rhs);
return *this;
}

size_t size() const
{
return strlen(data_);
}

const char* c_str() const
{
return data_;
}

void swap(String& rhs)
{
std::swap(data_, rhs.data_);
}

private:
char* data_;
}
1
2
3
4
5
String& operator=(String rhs) // yes, pass-by-value
{
swap(rhs);
return *this;
}

使用swap的原因是,这个String类涉及到内存分配操作,这个操作可能会抛出异常;
上面的实现分3步:

  1. 把“源对象”拷贝到参数rhs里
  2. rhs对象和this对象做一下交换(仅仅交换指针)
  3. 返回this对象

第一步有可能发生异常(new操作失败),然后在这一步退出;这是下两歩操作还没有进行,所以不会污染this对象。保证了:

  1. 赋值操作失败,但是this对象没有被污染,或者
  2. 赋值操作成功

参考资料