C++实现String类
来源:互联网 发布:广东省大数据局 编辑:程序博客网 时间:2024/05/20 14:18
C++实现String类,还没有完成,待继续。
有以下注意的点:
(1)赋值操作符返回的是一个MyString&,而重载的+返回的是一个MyString。其中的原因参看《effective c++》,主要是返回引用的时候,必须返回必须在此函数之前存在的引用,因为引用是一个名字,“在我们使用之前,必须想想他代表了那个名字“。如果返回了一个局部对象的引用,那么这个函数结束后,这个引用就会指向一个不存在的对象,显然,这是走上了行为未定义的快车道。
# include <iostream># include <memory># include <cstring>using namespace std;class MyString {private:char *m_data;public:MyString();MyString(const char* ptr);MyString(const MyString& rhs);~MyString();MyString& operator=(const MyString& rhs);MyString operator+(const MyString& rhs);char operator[](const unsigned int index);bool operator==(const MyString& rhs);friend ostream& operator<<(ostream& output, const MyString &rhs);};//默认的构造函数 MyString::MyString() {m_data = new char[1];*m_data = '\0';}//使用const char* 来初始化 MyString::MyString(const char* ptr) {if (NULL == ptr) {m_data = new char[1];*m_data = '\0';} else {int len = strlen(ptr);m_data = new char[len + 1];strcpy(m_data, ptr);}}//拷贝构造函数 MyString::MyString(const MyString& rhs) {int len = strlen(rhs.m_data);m_data = new char[len + 1];strcpy(m_data, rhs.m_data);}bool MyString::operator ==(const MyString& rhs) {int result = strcmp(m_data, rhs.m_data);if (0 == result)return true;elsereturn false;}//赋值操作符 MyString& MyString::operator =(const MyString& rhs) {if (this != &rhs) {delete[] m_data;m_data = new char[strlen(rhs.m_data) + 1];strcpy(m_data, rhs.m_data);}return *this;}//重载运算符+ MyString MyString::operator+(const MyString &rhs) {MyString newString;if (!rhs.m_data)newString = *this;else if (!m_data)newString = rhs;else {newString.m_data = new char[strlen(m_data) + strlen(rhs.m_data) + 1];strcpy(newString.m_data, m_data);strcat(newString.m_data, rhs.m_data);}return newString;}//重载下标运算符 char MyString::operator [](const unsigned int index) {return m_data[index];}//析构函数 MyString::~MyString() {delete[] m_data;}//重载<< ostream& operator<<(ostream& output, const MyString &rhs) {output << rhs.m_data;return output;}int main() {const char* p = "hello,world";MyString s0 = "hello,world";MyString s1(p);MyString s2 = s1;MyString s3;s3 = s1;MyString s4 = s3 + s1;bool flag(s1 == s2);cout << s0 << endl;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << flag << endl;char result = s3[1];cout << result << endl;cout << s4 << endl;return 0;}
运行结果:
hello,world
hello,world
hello,world
hello,world
1
e
hello,worldhello,world
- 【C/C++】String类实现
- [C++]String类的实现
- [C++]String类的实现
- [C++]String类的实现
- C++String类的实现
- 【c++】string类的实现
- C++string类的实现
- C++:模拟实现string类
- C++string类的实现
- C++String类的实现
- 模拟实现string类(c++)
- C++string类的实现
- 【C++】模拟实现String类
- C/C++string类的实现
- 【学习笔记】【C++】自己实现string类
- c语言string类函数实现汇总
- 【C++】实现STL模板类string
- C++string类的一个实现
- 数据仓库项目管理的一些原则和实施方法
- LayoutInflater解析xml布局文件
- JSONP解决JS跨域
- 校准触摸屏即时生效
- TCP三次握手连接及seq和ack号的正确理解
- C++实现String类
- hibernate3.2与spring2.5集成
- mpg123
- 在xp,win7下程序运行时可以修改它的文件名,不知道为什么这样,估计要看一下内核相关的内容。
- OutOfMemory:PermGen Space异常的处理和分析
- 网络工程师基础知识(网络设备的选择和基本配置)
- Fedora14下 mysql更改密码
- synergy共享键盘鼠标
- 施密特触发器