一、运算符重载
下面介绍一种使对象操作更美观的技术。
运算符重载是一种形式的C++多态。
使用户能够定义多个名称相同但特征标(参数列表)不同的函数,这被称为函数重载或函数多态。
运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。
警告:不要返回指向局部变量或临时对象的引用。函数执行完毕之后,局部变量和临时对象将消失,引用将指向不存在的数据。
友元
C++控制对类对象私有部分的访问。通常公有类方法提供唯一的访问途径,但是有时候这重限制太严格,以至于不适合特定的编程问题。在这种情况租给你下,C++提供了另外一种形式的访问权限:友元。
友元有三种
友元函数;
友元类;
友元成员函数。
通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
创建友元
创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend;
friend Time operator*(double m, const Time & t);
该原型意味着下面两点:
虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;
虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。
友元是否有悖于OOP
你可能认为友元违反了OOP数据隐藏的原则,因为友元机制允许非成员函数访问私有数据。
然而,这个观点太片面了。相反,应将友元函数看做类的扩展接口的组成部分。
提示:如果要为类重载运算符,并将非类的项作为其第一个操作数,则可以用友元函数来翻转操作数的顺序。
警告:只有在类声明中的原型中才能使用friend关键字。除非函数定义也是原型,否则不能再函数定义中使用该关键字。
重载运算符:
作为成员函数还是非成员函数
对于很多运算符来说,可以选择成员函数或非成员函数来实现运算符重载。一般来说,非成员函数应是友元函数,这样它才能直接访问类的私有数据。
注意:非成员版本的重载运算符函数所需的形参数目与运算符时候用的操作数数目相同;而成员版本所需的参数数目少一个,因为其中的一个操作数是被隐式的传递的调用对象。
注意:一位运算符重载是通过函数来实现的,所有只要运算符函数的特征标不同,使用的加运算符数量与相应的内置C++运算符相同,就可以多次重载同一个运算符。
类的自动转换和强制类型转换
注意:只接受一个参数的构造函数定义了从参数类型到类类型的转换。如果时候用关键字explicit限定了这种构造函数,则它只能用于显示转换,否则也可以用于隐式转换。
转换函数
转换函数时用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。
转换函数必须时类方法;
转换函数不能指定返回类型;
转换函数不能有参数;
警告:应谨慎的使用隐式转换函数。通常,最好选择仅在被显式的调用时才会执行的函数。
总之,C++为类提供了下面的类型转换。
只有一个参数的类构造函数用于将类型与该参数相同的值转换为类类型。
被称为转换函数的特殊类成员运算符函数,用于将类对象转换为其他类型。转换函数是类成员,没有返回类型。没有参数。
举例:
Vector::operator double()
{
...
return a_double_value;
}
经验表明,最好不要依赖于这种隐式转换函数。
写这个的目的是为了记录我的抄书过程。这个你们看看就好,我可能都不会看第二遍。
我后面第一阶段完成之后会更新一些复习题,编程题来作为C++第一阶段学习成果的检验。
这个我建议你们多多关注,相信会对初学者有很好的帮助作用。