1.递增递减运算符

C++语言并不要求递增递减运算符必须是类的成员。可是由于他们改变的正好是所操作对象的状态。所以建议设定为成员函数。

对于递增与递减运算符来说,有前置与后置两个版本号,因此。我们应该为类定义两个版本号的递增与递减运算符。

问题来了。程序是怎样区分前置和后置呢?由于都是++和-- 为了解决问题,后置版本号的递增递减运算符接受一个额外的(不被使用)int类型的形參。当我们使用后置运算符时,编译器为这个形參提供一个值为0的实參。

这个形參唯一的作用就是区分前置和后置运算符函数。

由于不会用到int形參,所以无须为其命名。

样例例如以下:

  1. Person & Person::operator++()//前置版本号的++
  2. {
  3. age++;//only ++ age
  4. return *this;
  5. }
  6.  
  7. Person & Person::operator--()//前置版本号的--
  8. {
  9. age--;
  10. return *this;
  11. }
  12.  
  13. Person & Person::operator++(int)//后置版本号的++
  14. {
  15. Person &p = *this;
  16. age++;
  17. return p;
  18. }
  19.  
  20. Person & Person::operator--(int)//后置版本号的--
  21. {
  22. Person &p = *this;
  23. age--;
  24. return p;
  25. }
  1. int main()
  2. {
  3. Person p1(20, "SCOTT");
  4. Person p2(10, "Kate");
  5. cout << p1 << endl;
  6. p1--;
  7. cout << p1 << endl;
  8.  
  9. return 0;
  10. }

上述代码比較简单,为了方便演示。在我们的Person中仅仅对Person类中的age成员变量进行了递增递减操作。

执行结果:

Init Person

Init Person

p.age: 20, p.name: SCOTT

p.age: 19, p.name: SCOTT

~Person name: 0x8dcc048 age: 10

~Person name: 0x8dcc020 age: 19

2.成员訪问运算符

在迭代器类以及智能指针类中经常见到解引用运算符(*) 与 箭头运算符(->) 。

我们也能够自己定义这两个运算符。

样例:

  1. Person * Person::operator->()
  2. {
  3. return this;
  4. }
  1. Person & Person::operator*()
  2. {
  3. return *this;
  4. }
  1. int main()
  2. {
  3. Person p1(20, "SCOTT");
  4. Person p2(10, "Kate");
  5.  
  6. cout << p1->getName() << endl;
  7. cout << (*p2).getName() << endl;
  8.  
  9. return 0;
  10. }

执行结果:

Init Person

Init Person

SCOTT

Kate

~Person name: 0x89d7048 age: 10

~Person name: 0x89d7020 age: 20

C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符的更多相关文章

  1. C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符

    重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符, ...

  2. C++学习笔记-运算符重载

    运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...

  3. 新标准C++程序设计读书笔记_运算符重载

    形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...

  4. [C++ Primer] : 第14章: 重载运算符与类型转换

    基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...

  5. MOOC C++笔记(四):运算符重载

    第四周:运算符重载 基本概念 运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为. 运算符重载的目的是:扩展C++中提供的运算 ...

  6. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  7. C++中的运算符重载

    首先思考以下几个问题: 1.什么是运算符重载? 2.为什么要重载运算符,它有什么用? 3.可以重载哪些运算符? 4.重载运算符有哪些规则? 一.基本概念 我们在程序中使用各种操作符,比如加(+).赋值 ...

  8. C++:运算符重载

    运算符重载是一种形式的C++多态.运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义.实际上,很多C++运算符已经被重载.eg:将*运算符用于地址,将得到存储在这个地址中的值,将他用于 ...

  9. C++学习(12)—— 运算符重载

    运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1.加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> #i ...

随机推荐

  1. nyoj--311--完全背包(动态规划,完全背包)

    完全背包 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w. ...

  2. python-网络-udp

    python-网络-udp 标签(空格分隔): python 开发环境:windows Pycharm+python3.* 工具:网络调试助手 UDP[client]-发送数据 from socket ...

  3. 1570. [POJ3461]乌力波

    ★☆   输入文件:oulipo.in   输出文件:oulipo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 法国作家乔治·佩雷克(Georges Perec,1 ...

  4. TabLayout中Indicator的样式修改

    最近写一个项目的时候用到了TabLayout,其中Indicator只是固定的一条横线,样式只能修改Color和Height,没有办法改变形状和宽度等其他信息. 经过查看TabLayout类的源码,发 ...

  5. 关于ListView的一些不常用到的属性

    1.setCacheColorHint自定义listview的时候,当你不使用Android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况,破坏整体美观度 ...

  6. PostgreSQL Replication之第七章 理解Linux高可用(2)

    7.2 衡量可用性 可用性是提供商试图保证一定的可用性级别和客户可以期望的可用性或更多.在某些情况下(取决于服务合同) 收取罚款或减少申购费用是意外停机的原因. 可用性的质量使用百分数来衡量:例如,9 ...

  7. SSH概述与配置文件说明

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录.在出现SSH之前,系统管理员需要登入远程服务器执行系统管理任务时,都是用telnet来实现的,telnet协议采用明文密码传 ...

  8. bzoj2763 [JLOI]飞行路线 分层图最短路

    问题描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...

  9. 记intel杯比赛中各种bug与debug【其二】:intel caffe的使用和大坑

    放弃使用pytorch,学习caffe 本文仅记录个人观点,不免存在许多错误 Caffe 学习 caffe模型生成需要如下步骤 编写network.prototxt 编写solver.prototxt ...

  10. git error: object file .git/objects/b9/e269f50db2a3415cc8ad5ba40b82b9b6a13d45 is empty

    错误现象: 解决方法: 1.  find .git/objects/ -type f -empty | xargs rm 2. git fetch -p 3. git fsck --full