C++ Primer Plus学习笔记之使用类

101 阅读3分钟

前言

个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系。

一直以来都很想深入学习一下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();