处女贴!一个简单的字符串类,请各位朋友帮忙指教~

艺术乃创造也 2009-05-02 05:56:18
刚刚写了一个简单的字符串类,是老师布置的51假期练习!
从今年一月低 开始学习 C/C++ 到现在快4个月了!
也不知道自己写的代码会存在那些BUG

所以发到这里请 大家指教!~
大家一定要通俗的说出不足之处哈,不然我听不明白的!

小弟感激不尽!

MyString.H文件

#pragma once

//类名:字符串类
//作用:管理字符串
class CMyString
{
public:
CMyString(void);
CMyString(const char* pSrc);
CMyString(CMyString& pSrc);
~CMyString(void);

//!重载运算符 =
//!用于直接给对象 赋值char型数据
void operator =(const char* pSrc);
//!重载运算符 =
//!用于直接给对象 赋值 另一个对象
void operator =(CMyString& pSrc);

//!重载运算符 +
//!用于将对象 与char型数据 相加
//!返回新的对象
CMyString operator +(const char* pSrc);
//!重载运算符 +
//!用于将对象 与另一个对象 相加
//!返回新的对象
CMyString operator +(CMyString& pSrc);

//!重载运算符 +=
//!用于直接给对象 连接char型数据
void operator +=(const char* pSrc);
//!重载运算符 +=
//!用于直接给对象 连接 另一个对象
void operator +=(CMyString& pSrc);

//!返回数据首地址
inline const char* str()
{return m_szData;}
//!返回数据长度
inline size_t size()
{return m_iSize;}
private:
//!取得参数的数据长度
size_t length(const char* pSrc);
//!把pSrc指向的数据拷贝到pDst指向的存储区
bool copyData(char* pDst,const char* pSrc);
//!增加存储区的长度
bool addSize(size_t iSize);
//!增加储区的数据
void addData(size_t iSize,const char* pSrc);
private:
//!数据存储区
char* m_szData;
//!数据长度记录
size_t m_iSize;
};



MyString.CPP文件

#include "MyString.h"

CMyString::CMyString(void)
{
//!初始类变量
//!建立长度为1的数据存储区
m_szData = new char;
//!赋予存储区一个结束符
*m_szData = '\0';
//!长度记录设为 0
m_iSize = 0;
}

CMyString::CMyString(const char* pSrc)
{
//!添加数据
addData(length(pSrc),pSrc);
}

CMyString::CMyString(CMyString& pSrc)
{
//!添加数据
addData(pSrc.size(),pSrc.str());
}

CMyString::~CMyString(void)
{
//!对象失效时释放存储区
delete []m_szData;
}

//!重载运算符 =
//!用于直接给对象 赋值char型数据
void CMyString::operator =(const char *pSrc)
{
//!删除旧数据
delete []m_szData;
//!添加数据
addData(length(pSrc),pSrc);
}

//!重载运算符 =
//!用于直接给对象 赋值 另一个对象
void CMyString::operator =(CMyString &pSrc)
{
//!删除旧数据
delete []m_szData;
//!添加数据
addData(pSrc.size(),pSrc.str());
}

//!重载运算符 +
//!用于将对象 与char型数据 相加
//!返回新的对象
CMyString CMyString::operator +(const char* pSrc)
{
//!如果参数为空
//!返回本地对象
if(!pSrc)
return *this;
//!建立一个临时对象
//!用来连接两个数据
CMyString Tmp = *this;
Tmp += pSrc;
return Tmp;
}

//!重载运算符 +
//!用于将对象 与另一个对象 相加
//!返回新的对象
CMyString CMyString::operator +(CMyString& pSrc)
{
//!如果参数数据长度为 0
//!返回本地对象
if(!pSrc.size())
return *this;
//!建立一个临时对象
//!用来连接两个数据
CMyString Tmp = *this;
Tmp += pSrc;
return Tmp;
}

//!重载运算符 +=
//!用于直接给对象 连接char型数据
void CMyString::operator +=(const char* pSrc)
{
//!如果数据为空 返回
if(!pSrc)
return;
//!得到数据长度
size_t iSize = length(pSrc);
//!增加存储区长度
addSize(iSize);
//!拷贝数据到存储区
copyData(m_szData+m_iSize,pSrc);
//!更新数据长度记录
m_iSize += iSize;
}
//!重载运算符 +=
//!用于直接给对象 连接 另一个对象
void CMyString::operator +=(CMyString& pSrc)
{
//!得到数据长度
size_t iSize = pSrc.size();
//!如果数据长度为0 返回
if(!iSize)
return;
//!增加存储区长度
addSize(iSize);
//!拷贝数据到存储区
copyData(m_szData+m_iSize,pSrc.str());
//!更新数据长度记录
m_iSize += iSize;
}

//!取得参数的数据长度
size_t CMyString::length(const char* pSrc)
{
//!如果数据为空 返回 0
if (!pSrc)
return 0;

//!声明一个临时指针 等于 数据起始地址
const char* pTmp = pSrc;
//!临时指针循环自加 到指向'\0'时结束
while(*pTmp++ != '\0');

//!返回
//!临时指针 减去 起始地址 再减结束符长度 的值
//!即为数据长度
return pTmp - pSrc -1;
}

//!把pSrc指向的数据拷贝到pDst指向的存储区
bool CMyString::copyData(char *pDst, const char *pSrc)
{
//!如果数据为空 返回 假
if (!pDst || !pSrc)
return false;
//!循环拷贝数据到结束符'\0'为止
while((*pDst++ = *pSrc++) != '\0');
//!返回 真
return true;
}

//!增加存储区的长度
bool CMyString::addSize(size_t iSize)
{
//!判断新增加的长度 =0 时返回假
if(!iSize)
return false;
//!建立一个新存储区
//!新存储长度 等于 旧数据长度 + 新增长度 + 结束符长度
char* pTemp = new char[m_iSize + iSize +1];
//!拷贝旧数据到新数据存储区
copyData(pTemp,m_szData);
//!删除旧数据
delete []m_szData;
//!旧存储区指针 指向 新存储区
m_szData = pTemp;
//!成功返回 真
return true;
}
//!增加储区的数据
void CMyString::addData(size_t iSize,const char* pSrc)
{
//!得到数据长度
m_iSize = iSize;
//!建立数据存储区
m_szData = new char[m_iSize+1];
//!拷贝数据
copyData(m_szData,pSrc);
}


...全文
244 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Delta 2009-05-03
  • 打赏
  • 举报
回复
学习一下了。
lzh9955 2009-05-02
  • 打赏
  • 举报
回复
不错嘛! 能写出来首先就很不错!
SimonYeung 2009-05-02
  • 打赏
  • 举报
回复
学习学习
Cpp权哥 2009-05-02
  • 打赏
  • 举报
回复
你的addData没有释放m_szData 原来指向的内存空间。
fellatioyzx 2009-05-02
  • 打赏
  • 举报
回复
纯学习,好长
nickyjay0501 2009-05-02
  • 打赏
  • 举报
回复
注意成员函数或运算符重载时的参数问题,如果形参在函数中没被改变,最好加个const,这样传递的实参既可以是const型,也可以是非const型,否则如果形参中没有const(前提是函数中对其只读),则只能接受非const型实参。加油!!!
mengde007 2009-05-02
  • 打赏
  • 举报
回复

CMyString::CMyString(void)
{
//!初始类变量
//!建立长度为1的数据存储区
m_szData = new char[]; //需要string头文件;
//!赋予存储区一个结束符
/*m_szData = '\0';
//!长度记录设为 0
m_iSize = 0;
}
楼主写的过于复杂;strlen()函数就搞定许多了;
艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
补充:
使用 VS2005 编译!

艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
我设置了
问题点数:20

不知道这是不是分数哈!欢迎各位大虾的到来!
现在是凌晨6:00
我睡觉去了!
艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lpf000 的回复:]
老实说注释太多 倒看不清代码;
构造函数
声明
CMyString(const CMyString& pSrc);
实现
CMyString::CMyString(const CMyString& pSrc)
{
//!添加数据
addData(pSrc.size(),pSrc.str());
}
为什么加const会出现这种情况!

1>c:\documents and settings\administrator\桌面\mystring\mystring\mystring.cpp(23) : error C2662: “CMyString::size”: 不能将“this”指针从“const CMyString”转换为“CM…
[/Quote]

我靠,你太牛B了!
马上给你 +分!

lpf000 2009-05-02
  • 打赏
  • 举报
回复
老实说注释太多 倒看不清代码;
构造函数
声明
CMyString(const CMyString& pSrc);
实现
CMyString::CMyString(const CMyString& pSrc)
{
//!添加数据
addData(pSrc.size(),pSrc.str());
}
为什么加const会出现这种情况!

1>c:\documents and settings\administrator\桌面\mystring\mystring\mystring.cpp(23) : error C2662: “CMyString::size”: 不能将“this”指针从“const CMyString”转换为“CMyString &”
1> 转换丢失限定符
你这个问题可能是这样,一般有些函数定义2个版本,一个非const版本,一个const成员函数版本,方便常对象调用,你定义一个size成员的基于const重载版本;
inline CMYString::size()const
{
return m_iSize;
}
多检查你的各成员函数 看看那些需要重载const版本吧;
对的话 给分哈
艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Thukoo 的回复:]
引用 4 楼 nickyjay0501 的回复:
注意成员函数或运算符重载时的参数问题,如果形参在函数中没被改变,最好加个const,这样传递的实参既可以是const型,也可以是非const型,否则如果形参中没有const(前提是函数中对其只读),则只能接受非const型实参。加油!!!

谢谢!
正如你所提出的!
其实我一开始开始就这样做!
例如:
构造函数
声明
CMyString(const CMyString& pSrc);
实现
CMyString::CMyString…
[/Quote]

还没有人来回答我这个问题吗?

大虾们,别睡觉了,这个问题至少给50%的分数
艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hikaliv 的回复:]
引用 19 楼 hikaliv 的回复:
引用 18 楼 Thukoo 的回复:

引用 17 楼 hikaliv 的回复:

4个月?

不错了。


从一月中旬开始
最初学C/C++
然后 WINDOWS程序设计
现在 DirectX 9.0
准备 网络通信
努力学习中!

目标是为了达到能开发网络游戏的级别!


你这是跑步进入社会主义啊……
不知道你以前的程序基础如何……
对你的学习进度和学习质量持保留意见……


我不才,从大一开始学现在…
[/Quote]

一月中旬以前只听说过C/C++如何如何强大!
一直心向往之!~
此前我只接触过一些VB和JAVA,弹不上学习,只能说是观看过
今年一月中旬,正式开始学习C/C++
//
我觉得写程序就是按照一个人的正常逻辑思维去做就行了!

我觉得难得是:这函数也太多了吧!
光宇广贞 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 hikaliv 的回复:]
引用 18 楼 Thukoo 的回复:

引用 17 楼 hikaliv 的回复:

4个月?

不错了。


从一月中旬开始
最初学C/C++
然后 WINDOWS程序设计
现在 DirectX 9.0
准备 网络通信
努力学习中!

目标是为了达到能开发网络游戏的级别!




你这是跑步进入社会主义啊……
不知道你以前的程序基础如何……
对你的学习进度和学习质量持保留意见……
[/Quote]

我不才,从大一开始学现在三四年了,才刚开始敢对自己说对编程有那么一点点认识……
光宇广贞 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Thukoo 的回复:]
引用 17 楼 hikaliv 的回复:

4个月?

不错了。


从一月中旬开始
最初学C/C++
然后 WINDOWS程序设计
现在 DirectX 9.0
准备 网络通信
努力学习中!

目标是为了达到能开发网络游戏的级别!


[/Quote]

你这是跑步进入社会主义啊……
不知道你以前的程序基础如何……
对你的学习进度和学习质量持保留意见……
艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hikaliv 的回复:]
4个月?

不错了。
[/Quote]

从一月中旬开始
最初学C/C++
然后 WINDOWS程序设计
现在 DirectX 9.0
准备 网络通信
努力学习中!

目标是为了达到能开发网络游戏的级别!

光宇广贞 2009-05-02
  • 打赏
  • 举报
回复
4个月?

不错了。
艺术乃创造也 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wxgiter 的回复:]
引用 11 楼 Thukoo 的回复:
引用 9 楼 SmallSmallSmallSmall 的回复:
注释太多,先去掉部分注释吧。。。

谢谢!
写这么多注释是为了,看我代码的人,能明白我的想法!
我还认为注释不够准确哈!


这注释也太多了点,去掉代码就成伪码了。。

还是不要假设看你程序的人没有一点基础为好。关键地方注释一下就行了吧。。。
[/Quote]

哦,好的,以后我把注释都跟在代码后面
看起来应该要好点!
wxgiter 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Thukoo 的回复:]
引用 9 楼 SmallSmallSmallSmall 的回复:
注释太多,先去掉部分注释吧。。。

谢谢!
写这么多注释是为了,看我代码的人,能明白我的想法!
我还认为注释不够准确哈!
[/Quote]

这注释也太多了点,去掉代码就成伪码了。。

还是不要假设看你程序的人没有一点基础为好。关键地方注释一下就行了吧。。。
Sou2012 2009-05-02
  • 打赏
  • 举报
回复
MARK!!
加载更多回复(6)
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 ### 中兴F420/F460/F660光猫超级密码配置及功能启用指南 #### 一、超级密码的获取与配置 对于中兴F420/F460/F660系列光猫设备,可以通过特定的命令行接口方法来获取并配置超级密码。以下指南详细说明了这一过程的实现方法。 **步骤1:** 启动任意一种网络浏览器,并键入网址`http://192.168.1.1/web_shell_cmd.gch`以进入命令行操作界面。 **步骤2:** 输入指令`sendcmd1DBpUserInfo`(需注意指令间的空格和大小写格式),该指令用于查询当前登录所使用的用户名及密码。通常情况下,预设的用户名与密码为`telecomadmin/telecomadmin+数字`。 **步骤3:** 如果需要变更用户名,可以在命令行环境中键入`sendcmd1DBsetUserInfo0Usernameadmin`(同样需注意空格和大小写),将用户名更改为`admin`。 **步骤4:** 继续输入`sendcmd1DBsetUserInfo0Passwordadmin`(同样需注意空格和大小写),将密码也设定为`admin`。 **步骤5:** 完成修改后,必须执行保存操作,通过输入命令`sendcmd1DBsave`(注意空格和大小写),以最终确认设置。 #### 二、远程控制功能的禁用 为了保障网络安全,防止未经授权的远程访问,应按照以下步骤禁用远程控制功能: **步骤1:** 再次启动网络浏览器并输入网址`http://192.168.1.1/web_shell_cmd.gch`。 **步骤2:** 键入指令`se...

65,210

社区成员

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

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