内容思维导图

1. 操作符重载
- 操作符重载(Operator overloading)是一种形式的C++多态。第8章中用户能够定义多个名称相同但特征标(参数列表)不同的函数,这种称为函数重载(function overloading)或函数多态(functional polymorphism)。
- 要重载操作符,需使用被称为操作符函数的特殊函数形式,格式如下:
// op表示要重载的操作符,如operator +()
operator op(argument-list)
op必须是有效的C++操作符,不能虚构一个新的符号。
-
警告:不要返回指向局部变量或临时对象的引用。
-
操作符重载的限制
- 重载后的操作符必须至少有一个操作数是用户定义的类型,防止用户为标准类型重载操作符。
- 使用操作符时不能违反操作符原来的句法规则。同样,不能修改操作符的优先级。
- 不能定义新的操作符。
-
- 不能重载下面的操作符:
-
sizeof
操作符 - 成员操作符
.
- 成员指针操作符
-*
- 作用域解析操作符
::
- 条件操作符
?:
-
typeid
,一个RTTI操作符 - 强制类型转换操作符:
const_cast, dynamic_cast, reinterpret_cast, static_cast
-
只能通过成员函数进行重载的操作符
- 赋值操作符
=
- 赋值操作符
- 函数调用操作符
()
- 函数调用操作符
- 下标操作符
[]
- 下标操作符
- 通过指针访问类成员的操作符
->
- 通过指针访问类成员的操作符
2. 友元简介
- 友元的3种类别
- 友元函数
- 友元类
- 友元成员函数
- 通过让函数成为类的友元,可赋予该函数与类成员函数相同的访问权限。
- 创建友元函数,将其原型放在类声明中,并在原型声明前加上关键字friend
friend Time operator*(double m, const Time & t) const;
1. operator*()函数是在类中声明,但它不是成员函数,不能用成员操作符来调用。
2. operator*()不是成员函数,但与成员函数的访问权限相同。
3. 函数定义不需要使用`friend`关键字,而且不是成员函数也不需要使用限定符`Time::`。
-
<<
操作符重载常见定义形式如下:
ostream& operator<<(ostream& os, className& obj)
{
os << ...; // 显示对象
return os;
}
3. 操作符重载:作为成员函数还是非成员函数
- 使用成员函数和非成员函数重载的形式:
//---------声明:其中Time为一个类
// 成员函数版本
Time operator+(const Time& t) const;
// 友元函数版本
friend Time operator+(const Time& t1, const Time& t2);
//----------使用:其中T1, T2和T3都是Time对象
T1 = T2 + T3;
// 成员函数版本实际调用形式
T1 = T2.operator+(T3);
// 友元函数实际调用形式
T1 = operator+(T2, T3);
- 上述两种格式只能选择一种用来定义操作符,同时定义两种格式将被视为二义性错误。
4. 类的自动转换和强制类型转换
- 一个参数的构造函数的自动转换
// 构造函数
Stonewt(double lbs);
// 则可以使用double赋值
Stonewt myCat;
myCat = 19.6; // C++使用19.6创建Stonewt临时对象然后赋值到myCat中。
- 使用
explicit
关键字关闭自动转换特性
explicit Stonewt(double lbs);
Stonewt myCat;
myCat = 19.6; // 不允许
myCat = Stonewt(19.6); // 可以
myCat = (Stonewt)19.6; // 可以
- 一个参数的构造函数可能存在的隐式转换(以
Stonewt(double)
为例)- 将
Stonewt
对象初始化为double
值。 - 将
double
值赋给Stonewt
对象。 - 将
double
值传递给接受Stonewt
参数的函数时。 - 返回值为
Stonewt
的函数试图返回一个double
值时。 - 上述任意一种情况下,使用可转换为
double
类型的内置类型。
- 将
- 转换函数的形式(TypeName为要转换的类型):
// 转换函数的形式
operator TypeName();
// 示例
class Cat
{
...
public:
// 转换函数
operator int() const;
operator double() const;
}
1. 转换函数必须是类方法。
2. 转换函数不能指定返回类型。
3. 转换函数不能有参数。
网友评论