下面这个例子是来编写一个长度可变的字符串类String,该类有一个char*类型的成员变量,用以指向动态分配的存储空间。
#include<iostream>
#include<cstring>
using namespace std;
class String{
private:
char * str;
public:
String():str(NULL){}//此构造函数将str初始化为NULL,仅当执行了operator=成员函数后,str才会指向动态分配的存储空间
const char* cstr() const{//返回了指向|String对象内部动态分配的存储空间|的指针
return str;//不希望外部得到这个指针后修改其指向的字符串内容,因此将返回值设为const char*
}
String & operator=(const char*s);
~String();
};
String &String::operator=( const char*s){//重载=,使得obj="hello"成立
if(str)//首先判断str是否已经指向动态分配的存储空间,如果是则要先释放那片空间,然后重新分配一片空间,再将参数s指向的内容复制过去
delete []str;
if(s){//s不为NULL才能执行复制操作
str=new char[strlen(s)+1];//分配时要考虑到字符串结尾的'\0',因此分配的字节数要比strlen(s)多1
strcpy(str,s);
}
else
str=NULL;
return *this;
}
String ::~String(){
if(str)
delete []str;
};
int main(){
Strings;
s="Good luck,";
cout<<s.cstr()<<endl;
s="Shenzhou8!";
cout<<s.cstr()<<endl;
return 0;
}