//
.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));
}
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;
String s2( "" );
s2 = s1;
所以,在strcpy()之前,应该先判断des和src的长度,为des分配足够的空间。
另一个问题关于const。同样是在 operator = ()中, rht.getLength()的调用就会出现问题。rht是一个const型的引用变量,一个const的变量,无论是值、指针还是引用,都只能调用const函数。因此应该将个体getLength()声明为const。
这又引出一个编程规范问题,就是尽可能使用const,这样可以使代码更健壮。 getLength()并不修改成员变量,完全可以声明成const型。