重载操作符
重载操作符的定义
重载操作符是具有特殊名称的函数:保留字operator后接需定义的操作符符号。
如:Sales_item operator+(const Sales_item& , const Sales_item&);
class Sales_item{
public:
Sales_item operator+(const Sales_item & s1, const Sales_item s2) {
Sales_item item;
item.age = s1.age + s2.age;
return item;
}
private:
}
重载操作符设计原则
1.不要重载具有内置含义的操作符(&, &&, ||等)
2.大多数操作对类对象没有意义(类对象中可以直接用方法搞定)
3.复合赋值操作符(逻辑上有+,则应该也定义+=)
4.相关关系操作符(逻辑上定义 < 于,则应该定义全部>, >=, <, <=)
5.选择成员或非成员实现(赋值=, 下标[], 调用(), 和成员访问箭头->等操作必需定义为成员......)
输入输出操作符
定义全局的<<输出操作符
ostream& operator<<(ostream &out, const Sales_item& s) {
out << s.isbn << "\t" << s.avg_price();
return out;
}
IO输入输出操作符为非成员函数,若想上述方法为Sales_item工作,则上述方法应设置为友元ostream能访问的方法friend std::istream &operator << .....
算术操作符和关系操作符
+, -, *, /, %
赋值操作符
=, +=
必需返回对*this的引用
下标操作符
[]
int &operator[] (const sizt);
成员访问操作符
*, ->
const Screen &operator*() const { return *ptr->sp; }
const Screen *operator->() const { return ptr->sp; }
自增自减操作符
++, --
前自增/前自减:CheckedPtr& CheckedPtr::operator++(); // 返回的是引用
后自增/后自减:CheckedPtr CheckedPtr::operator++(int); // 后缀式添加int形参数,返回的是当前对象的副本
转换
转换的作用
1.支持混合表达式
int operator+(int, const SmallInt &);
int operator+(const SmallInt&, int);
SmallInt operator+(const SmallInt&, const SmallInt&);
2.转换减少所需操作符的数目
转换的定义
operator type();
如:
class SmallInt{
public:
operator int() const{ return val; }
}
转换不允许为数组或者函数类型
特点:
1.只能应用一个类类型转换
2.类类型转换和标准转换按需分先后执行
3.选择最佳匹配进行转换
4.禁止转换的二义性(特别小心)