第11章使用类
本章主要讨论了一下几个问题:
※运算符重载
※友元函数
※类的自动转换和强制转换
其中重点放在类设计技术上。
一、 运算符重载
运算符重载是一种形式的C++多态技术
1、运算符重载的格式
operatorop (argument-list)
例如,t1,t2为Time类对象,对+进行重载:
Timeoperator + (const Time& t)
在执行Time t=t1+t2的时候,编译器会使用相应的运算符函数替换上述的运算符:T=t1.operator+(t2)
2、运算符重载的限制
(1)重载后的运算符至少有一个是操作数是用户自己定义的类型,防止用户为标准类型重载运算符;
(2)运算符重载不能改变运算符原有的句法规则,同样运算符优先级不能改变;
(3)不能重载原本不存在的运算符
以下运算符不能重载:
sizeof:sizeof运算符
. :成员运算符
.* :成员指针运算符
:: :作用域解析运算符
?: :条件运算符
Typeid:一个RTTI运算符
const_cast:强制类型转换运算符
dynamic_cast:强制类型转换运算符
reinterpret_cast:强制类型转换运算符
static_cast:强制类型转换运算符
(4)下面的运算符只能通过成员函数重载:
=:赋值运算符
():函数调用运算符
[]:下标运算符
->:通过指针访问类成员的运算符
二、 友元函数
C++提供了两种访问私有成员的方法:一种是类成员函数,另外一种是友元。友元有三种:友元函数、友元类和友元成员函数。本章主要介绍友元函数。
友元函数是非成员函数,但是却可以访问类的私有成员。
1、创建友元函数
创建友元函数分为两个步骤:
(1) 将友元函数的原型放在类声明当中,并在原型声明前面加上friend:
Friend Time operator*(double m, const Time& t)
(2) 编写函数定义
编写函数定义时不需要加::限定符,此外,不需要使用关键字friend
2、重载<<运算符
<<是最常见的需要重载的运算符,其重载方式基本统一:
ostream& operator<<(ostream& os,const Time& t)
{
operation...;
return os;
}
对很多运算符来说,既可以使用成员函数也可以使用非成员函数进行重载。一般来说,非成员函数应是友元函数,这样才能直接访问类的私有成员。
三、 类的自动转换和强制转换
1、只有一个参数的构造函数用于将类型与该参数相同的值转换为类类型。例如,可以使用Time类的构造函数将int类型的值赋给Time类的对象;
2、可以使用一种特殊的类成员运算符函数——转换函数,将类对象转换成其他类型。转换函数没有返回值和参数,但是必须返回转换后的值。
转换函数的声明方式为:operator typename()
例如:operator double()