这阵子不怎么忙,闲时把Effective c++,more Effective c++, Exceptional c++,more Exceptional c++在复习了下,根据c++ primer 中提到设计一个string 类型需要的功能,编了一个异常安全的string 类。类基于shared_ptr<char>实现,使用的是vc9的shared_ptr(发现vc9的shared_ptr的reset函数可能有问题,看boost的源码,觉得boost的是没有问题的。大家可以试试。),大家也可以使用boost的shared_ptr。一直都是关注大家的文章,今天终于写下了自己的文章了。咱们博客有不少强人,希望大家提点建议。
1,头文件: myString.h
myString.h
1
2#include <memory>
3
4using namespace std::tr1;
5
6class myString
7{
8private:
9 shared_ptr<char> data_;
10
11public:
12 explicit myString(const char *cstr = 0);
13 myString(const myString &str);
14
15 ~myString();
16
17 myString& operator=(const myString &str);
18 char& operator[](int index);
19 myString operator +(const myString &str);
20 myString& operator+=(const myString &str);
21
22 size_t length();
23 bool empty();
24 bool equal(const myString &str);
25 const char* toCstr();
26
27private:
28
29};
30
31
2,实现文件:myString.cpp
myString.cpp
1
2#include "stdafx.h"
3#include "myString.h"
4
5#include <cstring>
6#include <assert.h>
7
8//异常安全的构造函数实现
9myString::myString(const char *cstr)
10:data_(const_cast<char*>(cstr))
11{
12
13}
14
15//异常安全的构造函数实现
16myString::myString(const myString &str)
17:data_(str.data_)
18{
19
20}
21
22myString::~myString()
23{
24
25}
26
27myString& myString::operator =(const myString &str)
28{
29 //if(&str != this)//不能使用str != *this
30 if(equal(str))
31 {
32 myString temp(str);
33 data_.swap(temp.data_);
34 //从boost源码看出reset就是使用swap实现的,swap使用
35 //std::swap实现。为什么这里使用reset实现有问题而swap
36 //没有问题?
37 //data_.reset(str.data_.get());
38 }
39
40 return *this;
41}
42
43char& myString::operator [](int index)
44{
45 assert(index > 0);
46 assert(data_.get());
47 assert((size_t)index < strlen(data_.get()));
48
49 return data_.get()[index];
50}
51
52//+ ,+=号可以互相实现,并且效率差不多。
53//因此,此处,并不认为+= 比 +效率要高
54//(如果使用+实现+=)
55
56
57myString myString::operator +(const myString &str)
58{
59 /**//*assert(str.data_.get());
60 assert(data_.get());
61 size_t olen = strlen(str.data_.get());
62 size_t slen = strlen(data_.get());
63 myString temp(new char[olen + slen + 1]);
64 memcpy(temp.data_.get(),data_.get(),slen);
65 memcpy(temp.data_.get() + slen,str.data_.get(),olen);
66 temp.data_.get()[olen+slen] = 0;*/
67
68 myString temp(*this);
69 temp += str;
70
71 return temp;
72}
73
74myString& myString::operator +=(const myString &str)
75{
76 assert(str.data_.get());
77 assert(data_.get());
78
79 size_t olen = strlen(str.data_.get());
80 size_t slen = strlen(data_.get());
81
82 shared_ptr<char> temp(new char[olen + slen + 1]);
83 memcpy(temp.get(),data_.get(),slen);
84 memcpy(temp.get() + slen,str.data_.get(),olen);
85 temp.get()[olen+slen] = 0;
86
87 data_.swap(temp);
88
89 /**//*myString temp = operator +(str);
90 data_.swap(temp.data_);*/
91
92 return *this;
93}
94
95size_t myString::length()
96{
97 assert(data_.get());
98 return strlen(data_.get());
99}
100
101bool myString::empty()
102{
103 return (data_.get() == 0);
104}
105
106//两个对象相等、同一对象问题,
107//值相等,同一地址?
108bool myString::equal(const myString &str)
109{
110 return (&str == this);
111 //return (data_.get() == str.data_.get());
112}
113
114const char* myString::toCstr()
115{
116 return data_.get();
117}
3,测试代码:
测试代码
1#include "myString.h"
2
3int _tmain(int argc, _TCHAR* argv[])
4{
5
6 myString tt[10];
7 char *cx = "";
8 char *cxx = 0;
9
10 //"" != 0
11 myString test1("");
12 bool bb = test1.empty();
13 myString test2("adgsdfg");
14 myString test3("");
15 myString test4(test2);
16
17 int len;
18 len = test1.length();
19 len = test2.length();
20 len = test3.length();
21 len = test4.length();
22
23 bool bempty;
24 bempty = test1.empty();
25 bempty = test2.empty();
26 bempty = test3.empty();
27 bempty = test4.empty();
28
29
30
31 const char * cstr;
32 cstr = test1.toCstr();
33 cstr = test2.toCstr();
34 cstr = test3.toCstr();
35 cstr = test4.toCstr();
36
37 bool bequal;
38 bequal = test1.equal(test2);
39 bequal = test1.equal(test3);
40 bequal = test1.equal(test4);
41
42 myString test5 = test1 + test2;
43
44 test5 = test4 + test2;
45
46 test5 +=test4;
47
48
49 char c;
50 c = test1[0];
51 c = test2[0];
52 c = test3[0];
53 c = test4[0];
54}
4,代码打包地址:/Files/Alex-Lee/myString.rar
posted on 2009-03-18 09:12
Alex-Lee 阅读(1821)
评论(12) 编辑 收藏 引用