美文网首页
《C++ Primer Plus》第11章学习笔记

《C++ Primer Plus》第11章学习笔记

作者: 蓬篙人 | 来源:发表于2021-06-17 03:49 被阅读0次

内容思维导图

第11章 使用类

1. 操作符重载

  • 操作符重载(Operator overloading)是一种形式的C++多态。第8章中用户能够定义多个名称相同但特征标(参数列表)不同的函数,这种称为函数重载(function overloading)或函数多态(functional polymorphism)
  • 要重载操作符,需使用被称为操作符函数的特殊函数形式,格式如下:
// op表示要重载的操作符,如operator +()
operator op(argument-list)
op必须是有效的C++操作符,不能虚构一个新的符号。
  • 警告:不要返回指向局部变量或临时对象的引用。

  • 操作符重载的限制

      1. 重载后的操作符必须至少有一个操作数是用户定义的类型,防止用户为标准类型重载操作符。
      1. 使用操作符时不能违反操作符原来的句法规则。同样,不能修改操作符的优先级。
      1. 不能定义新的操作符。
      1. 不能重载下面的操作符:
      • sizeof操作符
      • 成员操作符.
      • 成员指针操作符-*
      • 作用域解析操作符::
      • 条件操作符?:
      • typeid,一个RTTI操作符
      • 强制类型转换操作符:const_cast, dynamic_cast, reinterpret_cast, static_cast
  • 只能通过成员函数进行重载的操作符

      1. 赋值操作符=
      1. 函数调用操作符()
      1. 下标操作符[]
      1. 通过指针访问类成员的操作符->

2. 友元简介

  • 友元的3种类别
      1. 友元函数
      1. 友元类
      1. 友元成员函数
  • 通过让函数成为类的友元,可赋予该函数与类成员函数相同的访问权限。
  • 创建友元函数,将其原型放在类声明中,并在原型声明前加上关键字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. 转换函数不能有参数。

相关文章

  • c primer plus 和 c++ primer plus

    c++ primer plus 第6版:下载链接 备用链接1 备用链接2 c primer plus 第6版:下载...

  • [163]1.1关于c++类声明的记录【GeekBand】

    //C++微专业 第一周笔记 //以下点多来自 《C++ Primer Plus 》第6版 1. C++程序组成 ...

  • C++循环与决策

    Tags:C++,《C++ Primer Plus》笔记 一、循环## 语法### C++中有三种循环语句,语法与...

  • c++学习笔记——第一天

    一、c++综述 (1)书籍推荐 ①、c++ primer ②、c++ primer plus ③、c++编程思想 ...

  • C++I/O小结

    Tags:C++,《C++ Primer Plus》笔记 一、iostream## 头文件 用于对控制台进行输...

  • C++算术类型

    Tags:C++,《C++ Primer Plus》笔记 一、分类## 见下图,注意以下几点: char16_t,...

  • C++ Primer Plus第6版18个重点笔记

    下面是我看《C++ Primer Plus》第6版这本书后所做的笔记,作为备忘录便于以后复习。 笔记部分### C...

  • C++复合类型

    Tags:C++,《C++ Primer Plus》笔记 一、分类## 如下图,大概分为这些类型,每种类型的声明语...

  • C++模板库笔记

    C++标准模板库笔记(C++ Primer plus) 1.除序列外,vector还是可反转容器(reversib...

  • C++函数初识

    Tags:C++,《C++ Primer Plus》笔记 一、原型、定义与调用## 一个完整的函数包含原型、定义和...

网友评论

      本文标题:《C++ Primer Plus》第11章学习笔记

      本文链接:https://www.haomeiwen.com/subject/lfyqyltx.html