重载操作符的定义:
一、 不可重载的操作符::: .* . ?.;必须重载为成员函数的操作符:(),[],->,->;
二、 重载操作符必须具有一个类类型的操作数;
1、内置类型的操作符,含义不能改变;
2、不能为任何内置类型定义新的操作符;
三、 优先级和结合性是固定的;
四、 作为类成员的重载函数,其形参看起来比操作数少一,因为含有一个this指针;
重载输出《《:
一般定义:
1 ostream& operaotr<<(ostream& os,const classtype& object) 2 { 3 os<<。。。。。 4 return os; 5 }
输出操作符所做的格式化应尽量少;
IO操作符必须为非成员函数,一般为友元函数;
重载输入》》:
eg:
1 //Sale calss 2 istream& operator>>(istream& in,Sale& s){ 3 double price; 4 in>>s.isbn>>s.units_sold>>price; 5 if(in) 6 s.revenue=s.units_sold*price; 7 else 8 s=Sale(); //input fail:reset object to default state; 9 }
设计输入操作符时,如果可能,要确定错误恢复措施;以确保对象处于一致和可用状态;
定义算术操作符:既定义了算数操作符又定义了复合操作符的类,一般应使用复合操作符,这样避免创建和撤销一个临时变量。
定义相等操作符:
bool operator==(const type&a,const type&2);//declare;
1、操作符的两个对象必须是相同类型;
2、定义了==,也应定义!=;
重载下标操作符:
重载下标操作符 [] 是很常见的事情,它保存类中元素的顺序。vector 和 string 就是这样的类。在重载操作符[]时,一定要记住定义它的两个版本:非常量版本和常量版本:
class MyString
{
private:
char * buff;
int size;
public:
//...
char& operator [] (int index) { return buff[index]; } // 非常量版本
const char& operator [] (int index) const { return buff[index]; } // 常量版本 第一个const 返回值,第二个是函数不改变数据成员
};
当对象本身是常量时,下标操作符的常量版本被调用。
void f(const MyString& str)
{
char c = str[0]; // 调用const char& operator [] (int index) const
}
感觉应该有范围检查;