前言
个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系。
一直以来都很想深入学习一下C++,将其作为自己的主力开发语言。现在为了完成自己这一直以来的心愿,准备认真学习《C++ Primer Plus》。
为了提高学习效率,在学习的过程中将通过发布学习笔记的方式,持续记录自己学习C++的过程。
一、运算符重载
运算符重载是一种形式的C++多态。
运算符函数的格式如下:
operatorop(argument-list)
op必须是有效的C++运算符,不能虚构一个C++中没有的运算符。
示例:
operator+()
就是重载+运算符。
二、计算时间:一个运算符重载示例
C++对用户定义的运算符重载的限制:
-
重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。
-
使用运算符时不能违反运算符原来的句法规则。以及不能修改运算符的优先级。
-
不能创建新运算符。
-
不能重载
sizeof运算符、.成员运算符、.*成员指针运算符、::作用域解析运算符、?:条件运算符、typeid一个RTTI运算符、const_cast强制类型转换运算符、dynamic_cast强制类型转换运算符、reinterpret_cast强制类型转换运算、static_cast强制类型转换运算。 -
部分运算符只能通过成员函数进行重载。
三、友元
通过友元可以访问类对象中的私有部分。友元有3种:
-
友元函数
-
友元类
-
友元成员函数
通过让函数称为类的友元,可以赋予该函数与类的成员函数相同的访问权限。
创建友元函数的第一步是将其原型放在类声明中,并在原型前加上关键字friend:
friend Time operator*(double m, const Time & t);
因为它不是成员函数,因此不使用Time::限定符。另外不要在定义中使用关键字friend,定义如下:
Time operator*(double m, const Time & t)
{
...
}
四、重载运算符:作为成员函数还是非成员函数
对于很多运算符来说,可以选择使用成员函数或非成员函数来实现运算符重载。一般来说,非成员函数是友元函数,这样它才能直接访问类的私有数据。
六、类的自动转换和强制类型类型转换
Stock (double price);
...
Stock stock;
stock = 12.3;
C++新增了关键字explicit用于关闭直接用等号自动转换进行赋值的特性,语法如下:
explicit Stock(double price);
要进行相反的转换必须使用特殊的C++运算符函数——转换函数。
转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。
要转换为typeName类型,需要使用这种形式的转换函数:
operator typeName();
请注意一下几点:
-
转换函数必须是类方法
-
转换函数不能指定返回类型
-
转换函数不能有参数
例如,转换为double类型的函数的原型如下:
operator double();