1. 编写下面类String的构造函数、拷贝构造函数、赋值运算符和析构函数。
class String
{
friend String operate+( const String &s1, const String &s2);
public:
String(const char *str=””);
~String(void);
String(const String &other);
String& operate = (const String &other);
private:
char *m_data;
};
答:
// 构造函数
String::String(const char *str)
{
if (NULL == str)
{
m_data = new char[1];
*m_data = ‘\0’;
}
else
{
size_t length = strlen(str);
m_data = new char[length+1];
strcpy(m_data, str);
}
}
// 析构函数
String::~String(void)
{
delete [] m_data;
m_data = NULL;
}
// 拷贝构造函数
String::String(const String &other)
{
size_t length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data, other.m_data);
}
// 赋值运算符
String &String::operate=(const String &other)
{
if (this != &other) // 检查自赋值
{
char *temp = new char[strlen(other.m_data)+1];
strcpy(temp, other.m_data);
delete [] m_data;
m_data = temp;
}
return *this;
}
String operate+( const String &s1, const String &s2)
{
String temp;
delete temp.m_data; // temp.m_data是仅含‘\0’的字符串
temp.m_data = new char[strlen(s1.m_data) + strlen(s2.m_data) + 1];
strcpy(temp.m_data, s1.m_data);
strcat(temp.m_data, s2.m_data);
return temp;
}
2. 定义类StrBlobPtr的前置++/--和后置++/--运算符。
class StrBlobPtr
{
public:
StrBlobPtr() : curr(0) {}
StrBlobPtr& operator++(); // 前置递增
StrBlobPtr& operator--(); // 前置递减
StrBlobPtr operator++(int); // 后置递增
StrBlobPtr operator--(int); // 后置递减
private:
int curr;
}
答:
// 前置版本:返回递增/递减对象的引用
StrBlobPtr& StrBlobPtr::operator++()
{
++curr;
return *this;
}
// 后置版本:返回递增/递减前的值,返回的形式是值而非引用
StrBlobPtr StrBlobPtr::operator++(int)
{
StrBlobPtr ret = *this;
++*this;
return ret;
}
3. 编写strcpy函数。
已知strcpy函数的原型为:char *strcpy(char *strDest, const char *strSrc);
其中,strDest是目的字符串,strSrc是源字符串。
(1) 不调用C++/C的字符串库函数,编写strcpy函数;
(2) strcpy能把strSrc的内容拷贝到strDest,为什么还要char*的返回值呢?
答:
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL)&&(strSrc!=NULL));
char *temp = strDest;
while (*strSrc != ‘\0’)
{
*strDest++ = *strSrc++; // 后置递增优先级>解引用>赋值,且都是右结合律
}
*strDest = ‘\0’;
return temp;
}
为了实现链表表达式。
这样接受char*/const char*参数的函数,可以直接包含调用strcpy函数。比如:
size_t length = strlen(strcpy(strDest, "Good Luck"));
cout << strcpy(strDest, "Good Luck") << endl;