前面说到了string类,为什么她就能够那么方便呢? 其实这是有原因的,因为它的背后有很多愿意默默奉献的英雄们在大力支持~~~今天就让我们来初窥其神秘的面纱(其实也只是冰山一角)! !
我们都知道string对象可以直接进行输入,输出,赋值,相加,比较等等,其实说到底就是string类中对大量的运算符进行了重载。那什么是运算符重载呢? 这个是C++重要的一部分内容,今天就一起来探讨探讨!!
我对运算符重载的理解简单说是这样的,对已有的运算符重新定义,使得满足我们使用的要求。(具体的请参考C++有关教材)。下面我们就直接自己动手写string类了。。。。
常见的创建对象的方法有String str; 或者 String str("i love C++"); 创建对象时就必须调用构造函数,所以这里可以通过默认构造函数来构造一个空字符串,同时也应该有一个带参数的构造函数。-----这里为了区别string类,就用String作为类名。
class String{
char *str ; //指向字符串的指针
int len; //记录字符串的长度
public:
String(){ //创建无参对象时调用
len = 0;
str = new char[1]; //动态申请一个char大小的内存空间
str[0] = '\0'; //表示字符串为空
}
String(const char* const str){ //创建带参数的对象时调用
len = strlen(str); //取得字符串的长度
this->str = new char[len+1]; //动态申请长度+1大小的内存空间,并把char数组的内存地址赋给str
for(int i=0; i<len; i++) //用传过来的字符串初始化
this->str[i] = str[i]; //这里会对数组越界进行检验(见下面)
this->str[len] = '\0'; //因为是数组,'\0'为结束标志
}
};
接下来可以开始运算符重载了。。。
编译器没有对数组越界的问题进行善意的提醒,所以我们可以自己来给自己进行安全的检验。所以选择了重载[ ]。
char& operator[](unsigned int len) //len作为数组的下标
{
if(len > this->len)
return str[this->len-1]; //如果下标超过了数组长度,那么返回数组最后一个可见字符
else
return str[len]; //否则返回该下标的数组元素
}
同时可以对这个函数进行重载,对const对象也可以进行操作
char operator[](unsigned int len) const //len作为数组的下标
{
if(len > this->len)
return str[this->len-1]; //如果下标超过了数组长度,那么返回数组最后一个可见字符
else
return str[len]; //否则返回该下标的数组元素
}
输出<<运算符 和 重载输入>>
对于对象可以直接这样输出cout<<str; 是因为重载了operator<< 。
friend ostream& operator<<(ostream& os, const String& s) // 固定格式 ,参数类型要对应cout是ostream对象
{
os<<s;
return os; //返回ostream对象,为的是可以进行连续的输出 如cout<<str1<<str2;
}
重载输入>> 与上面类似。。。
friend istream& operator>>(istream& is, String& s)
{
is>>s;
return is;
}
为了能够简单的对两个对象进行赋值,如 str1 = str2 ; 必须重载赋值 = 运算符。。。
String& operator=(const String& s)
{
if(this == &s) //如果字符串相同,返回当前对象
return *this;
delete []str; //否则,释放当前对象内存空间
len = s.getlen();
str = new char[len+1]; //重新申请内存空间
for(int i=0; i<len; i++) //把字符串s保存在str所指向的空间
str[i] = s[i];
str[i] = '\0';
return *this;
}
未完待续。。。。。