12.2.4 静态类成员函数
可以将成员函数声明为静态的(函数声明必须包含关键字static,但如果函数定义是独立的,则其中不能包含关键字 static),这样做有两个重要的后果。
首先,不能通过对象调用静态成员函数;实际上,静态成员函数甚至不能使用this指针。如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算符来调用它。例如,可以给String 类添加一个名为 HowMany()的静态成员函数,方法是在类声明中添加如下原型/定义:
static int HowMany(){
return num_strings};
调用它的方式如下:
int count=String::HowMany();//invoking a static member function
其次,由于静态成员函数不与特定的对象相关联,因此只能使用静态数据成员。例如,静态方法HowMany()可以访问静态成员num_string,但不能访问 str 和 len。同样,也可以使用静态成员函数设置类级(classwide)标记,以控制某些类接口的行为。例如,类级标记可以控制显示类内容的方法所使用的格式。
12.2.5 进一步重载赋值运算符
介绍针对 String 类的程序清单之前,先来考虑另一个问题。假设要将常规字符串复制到 String 对象中。例如,假设使用 getline(读取了一个字符串,并要将这个字符串放置到 String 对象中,前面定义的类方法让您能够这样编写代码:
String name;
char temp[40];
cin.getline(temp,40);
name =temp;//use constructor to convert type
但如果经常需要这样做,这将不是一种理想的解决方案。为解释其原因,先来回顾一下最后一条语句是怎样工作的。
1.程序使用构造函数 String(const char *)来创建一个临时 String对象,其中包含 temp 中的字符串副本。第11章介绍过,只有一个参数的构造函数被用作转换函数。
2.本章后面的程序清单12.6中的程序使用