forked from selfboot/CS_Offer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
String.cpp
132 lines (118 loc) · 2.67 KB
/
String.cpp
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
* @Author: xuezaigds@gmail.com
* @Last Modified time: 2016-03-01 15:44:17
*/
#include <iostream>
#include <vector>
class String
{
public:
String(const char *str=NULL);//普通构造函数
String(const String &str);//拷贝构造函数
String & operator =(const String &str);//赋值函数
~String();//析构函数
private:
char* m_data;//用于保存字符串
};
//普通构造函数
String::String(const char *str)
{
if (str==NULL)
{
m_data=new char[1]; //对空字符串自动申请存放结束标志'\0'的空间
if (m_data==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
m_data[0]='\0';
}
else
{
int length=strlen(str);
m_data=new char[length+1];
if (m_data==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
strcpy(m_data, str);
}
}
//拷贝构造函数
String::String(const String &str)
{ //输入参数为const型
int length=strlen(str.m_data);
m_data=new char[length+1];
if (m_data==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
strcpy(m_data, str.m_data);
}
// 赋值函数,异常安全的赋值函数
// 创建临时变量,接着将临时变量的 m_pData 和实例自身的做交换
// 临时变量是一个局部栈变量,会自行回收。
String& String::operator =(const String &str)
{
if(this != &str){ //检查自赋值
String tmp(str);
char* data = tmp.m_data;
tmp.m_data = m_data;
m_data = data;
}
return *this;
}
/*
String& String::operator =(const String &str)
{
//输入参数为const型
if (this==&str) //检查自赋值
return *this;
delete [] m_data;//释放原来的内存资源
m_data = NULL;
m_data = new char[strlen(str.m_data)+1];
if (m_data==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
strcpy(m_data,str.m_data);
return *this;//返回本对象的引用
}
*/
//析构函数
String::~String()
{
delete [] m_data;
}
void foo(String x)
{
}
void bar(const String& x)
{
}
String baz()
{
String ret("world");
return ret;
}
int main()
{
String s0;
String s1("hello");
String s2(s0);
String s3 = s1;
s2 = s1;
foo(s1);
bar(s1);
foo("temporary");
bar("temporary");
String s4 = baz();
std::vector<String> svec;
svec.push_back(s0);
svec.push_back(s1);
svec.push_back(baz());
svec.push_back("good job");
}