几个注意的问题:
1)构造函数中必须给所有的数据成员进行初始化。
2)注意在给指向字符串的指针赋值时,左右类型的对应。
char *s代表一个指向字符串的指针,所有右边必须是一个字符串常量“/0”,而不能是‘/0'.
3)一个指针只能指向一个地址,不能同时指向两个。
在给string分配了地址之后,下一步我们肯定是确定分配的地址中存放的具体内容,那么这个时候我们都是使用strcpy()或者是
memcpy()把对应的字符串存入地址中。
如果原来我们成这样实现:
MyString::MyString()
{
length = 0;
string = new char;
string = "/0";
++string_number;
}
那么我们在编译和实现的时候都不会发现有什么错,但是析构函数使用delete【】释放内存使执行结果会出现乱码,因为string=“/0”
让它指向了一个字符串,并没有分配内存空间,所以在释放的时候就会出现错误。
4)析构函数中的重要语句 delete【】不要忘
析构函数在使用的时候只会释放为对象分配的空间,但是对象的空间中只是存储了数据成员分配内存的地址,所以并没有释放数据成员
的内存空间,必须使用delete[]来进行释放,防止内存泄露
2.重载运算符的成员函数:
MyString &MyString::operator+=(const MyString&str)
{
char *dest;
dest = new char[str.length+length+1];
memcpy(dest,string,length);
memcpy(dest+length,str.string,str.length+1);
delete[]string;
length = length+str.length;
string = dest;
return*this;
}
MyString &MyString::operator+=(const char*str)
{
char *dest;
dest = new char[strlen(str)+length+1];
memcpy(dest,string,length);
memcpy(dest+length,str,strlen(str)+1);
delete[]string;
string = dest;
return *this;
}
//字符串赋值
MyString &MyString::operator=(const MyString&str)
{
if(&str == this)
return *this;
delete[]string;
string = new char[str.length];
memcpy(string,str.string,str.length);
length = str.length;
return *this;
}
注意的幾個問題:
1)+=运算中,调用函数的对象最终字符串长度肯定大于其原来的长度,所以在这个函数调用过程中,我们必须给字符串重新分配一块
两个字符串长度和大小的内存区域。但是因为函数返回值又必须是原调用对象的引用,所以我们要定义一个中间变量指针来存储2个
字符串合并结果,最后释放string指针原来的内存区域后,再让它指向合并字符串。
2)“=”赋值运算肯定和构造函数的初始化不一样。










