C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符
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_运算符重载_递增递减运算符_成员訪问运算符的更多相关文章
- C++ Primer 学习笔记_60_重载操作符与转换 --赋值、下标、成员訪问操作符
重载操作符与转换 --赋值.下标.成员訪问操作符 一.赋值操作符 类赋值操作符接受类类型形參,通常该形參是对类类型的const引用,但也能够是类类型或对类类型的非const引用.假设未定义这个操作符, ...
- C++学习笔记-运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...
- 新标准C++程序设计读书笔记_运算符重载
形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 class Complex { publ ...
- [C++ Primer] : 第14章: 重载运算符与类型转换
基本概念 重载运算符是具有特殊名字的函数: 它们的名字由关键字operator和其后要定义的运算符号共同组成. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多. 对于二元运算符来说, 左侧 ...
- MOOC C++笔记(四):运算符重载
第四周:运算符重载 基本概念 运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为. 运算符重载的目的是:扩展C++中提供的运算 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- C++中的运算符重载
首先思考以下几个问题: 1.什么是运算符重载? 2.为什么要重载运算符,它有什么用? 3.可以重载哪些运算符? 4.重载运算符有哪些规则? 一.基本概念 我们在程序中使用各种操作符,比如加(+).赋值 ...
- C++:运算符重载
运算符重载是一种形式的C++多态.运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义.实际上,很多C++运算符已经被重载.eg:将*运算符用于地址,将得到存储在这个地址中的值,将他用于 ...
- C++学习(12)—— 运算符重载
运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1.加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> #i ...
随机推荐
- sas数据导入终极汇总-之中的一个
将数据文件读入SAS --DATA Step / PROC IMPORT 1.将SAS文件读入SAS-- data sasuser.saslin; set "F:\sa ...
- BP神经网络模型及梯度下降法
BP(Back Propagation)网络是1985年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一. B ...
- sicily 1000. LinkedList
Description template <typename E> class LinkedList { private: // inner class: linked-list ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- Android-Context的一切
Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析, ...
- 《剑指offer》调整数组顺序使奇数位于偶数前面
一.题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.输入描述 ...
- 使用HANDLECOLLISIONS的几个场景
使用HANDLECOLLISIONS的几个场景: 1.target丢失delete记录(missing delete),忽略该问题并不记录到discardfile 2.target丢失update记录 ...
- 分享一个简单好用的ipv6正则表达式
网上找了好几个,都不太好使.比较严谨的又运行缓慢,而且文本中多处含ipv6的时候,又提取不出全部的ipv6. 故分享一个不太严谨效率又高的ipv6正则表达式: ([a-f0-9]{1,4}(:[a-f ...
- python Web抓取(一)[没写完]
需要的模块: python web抓取通过: webbrowser:是python自带的,打开浏览器获取指定页面 requests:从因特网上下载文件和网页 Beautiful Soup:解析HTML ...
- Object-C,遍历目录
最近武汉连续下雨很多天,降温了2次,温度一下子由28度到14度,再到8度,手太冷了. 加上最近发生了一些比较棘手的家庭琐事,最近没心情继续学习Object-C. 后来,我想明白了,心情不好的时候,还是 ...