定义一个基本的String 类
class String
{
public:
String():base(" "){}
private:
char *base;
long int length;
};
我们可以看到在这个类里面我们用一个char型指针来保存字符串值,long int 型值length来保存字符串的长度。
① 由于我们知道string类支持这样的构造函数:
string str(“hello”);
string str(5,’c’);
string str1(str,2);
string str2(str,0,2);
故我们给我们的String类添加相应的构造函数:
class String
{
public:
String():base(""),length(0){}
String(const char* p)
{
if (p == NULL)
{
base = new char[1];
base = '/0';
}
else
{
base = new char[strlen(p)+1];
strcpy(base,p);
}
length = strlen(p);
}
String(int count,char ch)
{
base = new char[count+1];
for (int i=0; i<count; i++)
{
base[i] = ch;
}
base[++i] = '/0';
length = count;
}
String(String& str,int count)
{
base = new char[count+1];
strncpy(base,str.base,count);
base[count] = '/0';
length = count;
}
String(String& str,int index,int count)
{
base = new char[count+1];
for (int i=index,j=0; i<count+index; i++)
{
base[j++] = str.base[i];
}
base[j] = '/0';
length = count;
}
private:
char *base;
long int length;
};
② 为类添加拷贝构造函数和析构函数
拷贝构造函数:
String(const String &str)
{
base = new char[str.length+1];
strcpy(base,str.base);
}
注意这里的拷贝构造函数的形参是定义为const,为什么要定义为const呢?是因为要既能接收const实参,又能接受非const实参。若是我们定义为非const,则无法接受const实参了。那为什么我们不定义函数重载呢。那是一个类只能有一个复制构造函数啦。
析构函数:
~String()
{
if (length != 0)//防止空串情况。
delete base;
}