12-2改进后的新String类

12.2改进后的新String类

注意:c++11建议使用nullptr来表示空指针

String类与常规c字符串进行比较时,会转换成String类

先使用构造函数将c字符串转换为String类,再将两个String类进行比较

12.2.1使用中括号来访问String类中的字符

虽然对于二元操作符来说,两个操作数一个位于操作符的左侧,另一个位于右侧。但是对于[]来说,一个位于左侧,一个位于内部,这已经被设置好了。

//函数原型
char & String::operator[](int i)
{
return str[i];
}

注:返回值被设置为引用是为了解决如下赋值问题

String means("might");
means[0]='r';
//[]将会返回一个引用,且作为公有成员函数,有权利访问内部成员,所以可以将右值赋值给左侧的引用
对于const类型的String类,使用[]可能导致出错,因为[]函数不能保证不修改数据

解决方案

采用函数重载来提供一个仅供const String使用的operator版本

(c++会区分常量和非常量函数的特征标)

//重载后的函数原型
const char & String::operator[](int i) const
{
return str[i];
}

12.2.2静态类成员函数

不能通过对象来调用静态类成员函数,静态类成员函数也不能使用this指针(因为静态类成员属于整个类)

//调用方法
int count = String::Howmany(); //使用类名和作用域解析符,而不是通过对象!!!

//函数原型
static int Howmany(){return num_strings;}
//声明必须有关键字static,定义中不能出现(除非和声明一起)

12.2.3进一步重载赋值运算符

将常规字符串复制到String类对象中,因为隐含步骤较多,解决方法比较差

String name;
char temp[40];
cin.getline(temp,40);
name=temp; //这个语句实际上执行了三步

函数先调用了构造函数String(const char *)创建了一个匿名的临时对象

再使用String & String::operator=(const String &)来复制对象

最后调用析构函数来删除临时对象

解决方案

通过重载赋值运算符来直接使用常规字符串,简化了创建和删除工作

String & String::operator=(const char *)
{
delete [] str; //释放原有的内存
len = std::strlen(s);
str = new char[len+1];
std::strcpy(str,s);
return *this;
}