1.递增递减运算符

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

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

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

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

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

样例例如以下:

Person & Person::operator++()//前置版本号的++
{
age++;//only ++ age
return *this;
} Person & Person::operator--()//前置版本号的--
{
age--;
return *this;
} Person & Person::operator++(int)//后置版本号的++
{
Person &p = *this;
age++;
return p;
} Person & Person::operator--(int)//后置版本号的--
{
Person &p = *this;
age--;
return p;
}
int main()
{
Person p1(20, "SCOTT");
Person p2(10, "Kate");
cout << p1 << endl;
p1--;
cout << p1 << endl; return 0;
}

上述代码比較简单,为了方便演示。在我们的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.成员訪问运算符

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

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

样例:

Person * Person::operator->()
{
return this;
}
Person & Person::operator*()
{
return *this;
}
int main()
{
Person p1(20, "SCOTT");
Person p2(10, "Kate"); cout << p1->getName() << endl;
cout << (*p2).getName() << endl; return 0;
}

执行结果:

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. IPS

    转自:http://www.ithome.com.tw/node/79293 企業中網路環境的防護,通常都是先有防火牆,再搭配IPS.但是,實際上買得起IPS防護的企業有限,這是因為IPS的價格很昂貴 ...

  2. 46. AngularJS所有版本下载

    转自:https://www.cnblogs.com/best/tag/Angular/ 官网下载:https://angularjs.org/ AngularJS所有版本下载:https://cod ...

  3. [学习笔记]node.js中的path.extname方法

    path.extname 返回path路径文件扩展名,如果path以 ‘.' 为结尾,将返回 ‘.',如果无扩展名 又 不以'.'结尾,将返回空值. path.extname('index.html' ...

  4. java9新特性-9-语法改进:try语句

    1. 使用举例 在java8 之前,我们习惯于这样处理资源的关闭:     java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过.如下例所 ...

  5. jquery批量绑定click事件

    jquery批量绑定click事件: var selects = $(".public_select dd ul li"); debugger; /*$(".public ...

  6. SSRS 报表 日期类表达式

    一.如何填写表达式 右键点击单元格-表达式 二.表达式 当月1号 =DateSerial(DatePart("yyyy",Now()), DatePart("m" ...

  7. UI Framework-1: views Windowing

    views Windowing views provides support for creating dialog boxes and other kinds of windows through ...

  8. js 异步加载的方式

    js 异步加载的方式 渲染引擎遇到 script 标签会停下来,等到执行完脚本,继续向下渲染 defer 是“渲染完再执行”,async 是“下载完就执行”,defer 如果有多个脚本,会按照在页面中 ...

  9. 【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)

    [Solution] 接上一篇,在处理有向无环图的最长链问题的时候,可以在做拓扑排序的同时,一边做DP; 设f[i]表示第i个方块作为最上面的最高值; f[y]=max(f[y],f[x]+h[y]) ...

  10. Spring学习详解(1)——Spring入门详解

    一:spring的基本用法: 1,关于spring容器: spring容器是Spring的核心,该 容器负责管理spring中的java组件, ApplicationContext ctx  = ne ...