用C++重写String类,实现并不是最完美的,欢迎指正补充!后续还有更多类似的实现放上来, 欢迎关注!!!
2011-11-01 23:45
375 查看
/************************************************************************ 用C++重写String类,实现并不是最完美的,欢迎指正补充!后续还有更多类似的实现放上来, 欢迎关注!!! 对本贴有更好的方法或建议可以给本人留言或发邮件: Email:zww0815@qq.com Thanks! ************************************************************************/ #include <iostream>//一般国际标准.iostream后不加.h #include <ASSERT.H>//也可写成#include <assert.h>,大小写不限 using namespace std; /* //如果用#include <iostream.h> 后面就不用加using namespave std; #include <iostream.h> #include <ASSERT.H> #include <string.h> */ class String { public: String(const char* str=NULL);//复制构造函数 String(const String &other);//拷贝构造函数 ~String(void); //析构函数 String& operator=(const String& other);//赋值操作符重载 public: void PrintData();//打印m_data,m_data为私有成员变量,外部无法访问,只有通过尖类方法去访问 private: char* m_data; }; String::String(const char* str) { if (NULL == str) { m_data = new char[1];//给'\0' new一个字节的空间 assert(NULL != m_data); *m_data = '\0'; } else { int length = strlen(str); m_data = new char[length+1];//str不为NULL时要给m_data至少分配length+1个字节的空间 assert(NULL != m_data); strcpy(m_data,str); } } String::String(const String& other) { if (NULL == other.m_data) { m_data = new char[1];//给'\0' new一个字节的空间 assert(NULL != m_data); *m_data = '\0'; } else { int length = strlen(other.m_data); m_data = new char[length+1];//str不为NULL时要给m_data至少分配length+1个字节的空间 assert(NULL != m_data); strcpy(m_data,other.m_data); } } String::~String(void) { if (NULL != m_data) { delete[] m_data; m_data = NULL;//一定要让m_data指向NULL,否则为成为野指针,会造成程序崩溃 } //cout << "析构完成" << endl; } void String::PrintData() { cout << "m_data=" << m_data << endl; cout << strlen(m_data) << endl; } String& String::operator=(const String& other) { if (this == &other) { return *this; } if (NULL != m_data) { //这里m_data不为NULL的话应该清除m_data的内容 delete[] m_data; m_data = NULL; } int length = strlen(other.m_data); m_data = new char[length+1]; assert(NULL != m_data); memset( m_data,0,sizeof(char)*(length+1)); strcpy(m_data,other.m_data); return *this;//因为返回类型为String&引用类型,return *this } int main() { String a("Hello World"); String b; b = a; a.PrintData(); b.PrintData(); return 0; }
相关文章推荐
- 内存池的C++实现。可能还有小bug。欢迎指正
- 内存池的C++实现。可能还有小bug。欢迎指正
- 关注设计上的意义,而不是实现细节,从今天开始更多的关注思想
- C++实现split,若有问题,请指正。(有用C实现过的,欢迎贴代码)
- 4程序员小飞原计划三天完成某个任务,现在是第三天的下午,他马上就可以做完。但是在实现功能的过程中,他越来越意识到自己原来设计中的弱点,他应该采取另一个办法,才能避免后面集成阶段的额外工作。但是他如果现在就改弦更张,那势必要影响自己原来估计的准确性,并且会花费额外的时间,这样他的老板、同事也许会因此看不起他。如果他按部就班地按既定设计完成,还要花更多时间在后续集成上,但那就不是他个人的问题了,怎么办
- 个人对于微信公众平台开发的一些整理,后续会有补充,欢迎大家给予指正。一、关于如何获取微信公众原始号
- 模拟实现VC中的handle的c++方法,欢迎指正~~~
- 重写c++中string类,实现基本string功能
- C#语言实现对网页图片的随机抓取。基础办法,但还有一点小问题,欢迎大家指正
- C++实现类似反射模式(模板)
- C++开源库,欢迎补充。
- 四则表达式实现(dev cpp工具中运行通过,欢迎指正)
- C++实现String类
- C++中string类的实现
- (C++)已知String类的定义,实现其函数体
- 大整数乘法,似乎不是很健壮,过段时间再编个好的补充上来
- 模拟实现string类(c++)
- 标准的c++中int,float,double等怎么转换成string类,并实现文件写入
- 转载:Hadoop 应该用C++实现,而不是Java
- reportviewer动态加载报表的实现以及动态控制报表,套打,存折打印模式等的一些探讨,欢迎批评指正!