//.h
class String
{
public:
String(const char * pData = 0);
~String(void);
String& operator=(const String& rht);
int getLength() ;
private:
char* m_pData;
};
//.cpp
String::String(const char * pData)
{
m_pData = 0;
if (pData != 0)
{
int buf = 0;
buf = static_cast<int>(strlen(pData)+1);
m_pData = new char[buf];
strcpy(m_pData,pData);
}
}

String& String::operator=(const String& rht)
{
if (m_pData == 0) ...{
m_pData = new char[rht.getLength()+1]; // rht.getLength()可以这样调用吗?
}
strcpy(this->m_pData,rht.m_pData); //this->m_pData与rht.m_pData长度比较?
return *this;
}
String::~String(void)
{
if (m_pData != 0) ...{
delete [] m_pData;
m_pData = 0;
}
}
int String::getLength()
{
return static_cast<int>(strlen(m_pData));
}

上面的代码存在2个问题:
1、strcpy()的使用
2、const 的使用
首先看strcpy(char* des, const char* src),当src长度大于des长度时,这个函数会产生运行时错误,且错误随机产生。
代码中operator=()的实现就存在该问题。假设有下面代码:
String s1("1234");
String s2("");
s2 = s1;所以,在strcpy()之前,应该先判断des和src的长度,为des分配足够的空间。
另一个问题关于const。同样是在operator=()中,rht.getLength()的调用就会出现问题。rht是一个const型的引用变量,一个const的变量,无论是值、指针还是引用,都只能调用const函数。因此应该将个体getLength()声明为const。
这又引出一个编程规范问题,就是尽可能使用const,这样可以使代码更健壮。getLength()并不修改成员变量,完全可以声明成const型。
本文分析了一个字符串类实现中的问题,包括strcpy使用不当导致的潜在运行时错误及const修饰符的不正确使用。文章强调了在复制操作前进行长度检查的重要性,并提出将getLength方法声明为const以增强代码健壮性的建议。

1767

被折叠的 条评论
为什么被折叠?



