自定义字符串类MyStr

DayThinking 2012-04-11 04:45:01
以下是我自己编写的一个字符串类MyStr,不知这样写是否有不妥之处,求大侠们给指点,学习了!

#include "stdafx.h"
#include <iostream>
using namespace std;
class MyStr
{
friend ostream & operator<<(ostream & out,MyStr & mystr);
public:
MyStr(char *mystr=NULL):str(mystr){}
MyStr(const MyStr & mystr){str=mystr.str;}
MyStr& operator =(const MyStr &rhs)
{
if (this!=&rhs)
{
str=rhs.str;
}
return *this;
}
~MyStr(){}
private:
char * str;

};
ostream & operator<<(ostream & out,MyStr & mystr)
{
out<<mystr.str;
return out;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *pstr="123456";
//MyStr defstr(pstr);

/*MyStr defstr;
defstr=pstr;*/

MyStr defstr("123");

cout<<defstr<<endl;

system("pause");
return 0;
}
...全文
353 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
DayThinking 2012-04-12
  • 打赏
  • 举报
回复
非常感谢evencoming,特别是给我转发的那篇关于《位拷贝、值拷贝、深拷贝、浅拷贝 》的文档。
现在懂得了,谢谢你。好人,赞一个!
evencoming 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
问三楼,既然这是浅拷贝,程序为啥不会出错,按理浅拷贝对象被析构两次会出错的?
[/Quote]
因为你这些都是使用 字符串常量(标准说法 字面量)。
所以没问题。
如果设计到
char *pstr="123456";
改为
char pstr[]="123456";

..在输出前改变 pstr,即 pstr[1]='0';
那么你的MyStr的字符串也会跟着改变

DayThinking 2012-04-11
  • 打赏
  • 举报
回复
问三楼,既然这是浅拷贝,程序为啥不会出错,按理浅拷贝对象被析构两次会出错的?
int _tmain(int argc, _TCHAR* argv[])
{
char *pstr="123456";
MyStr str("11111");
MyStr defstr(str);
MyStr defstr1=str;

str=pstr;

/*MyStr defstr;
defstr=pstr;*/

/*MyStr defstr("123");*/

cout<<str<<"\t"<<defstr<<"\t"<<defstr1<<endl;

system("pause");
return 0;
}
输出结果是:123456 11111 11111 为啥不是123456 123456 123456
LittleCommit 2012-04-11
  • 打赏
  • 举报
回复
MyStr(char *mystr=NULL):str(mystr){}
MyStr(const MyStr & mystr){str=mystr.str;}
MyStr& operator =(const MyStr &rhs)
{
if (this!=&rhs)
{
str=rhs.str;
}
return *this;
}

这三个函数的实现都需要深拷贝,而不是简单的指针赋值。
evencoming 2012-04-11
  • 打赏
  • 举报
回复
MyStr& operator =(const MyStr &rhs)
{
if (this!=&rhs)
{
delete str;
str=new char[strlen(rhs.str)+1];
strcpy(str,rhs.str);
}
return *this;
}


因为每个字符串应该都是独立的。 所以需要字符串整个拷贝而不是仅仅只拷贝值。

~MyStr(){delete str;str=0};
释放内存。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧