c++重载前置++和--
C语言中,前置和后置++,--都不能作为左值,而在c++中,前置的++和--可以作为左值,从下面的重载运算符中也可以看出,它们返回的是引用,我不知道为什么这里和c语言中不同,但c++类似的提升还有三目运算符?:,在c中也不可以做左值,但c++中可以。或者是因为c++提出了引用,进而对c做了一定的提升吧。
重载前置++和--,分别采用成员函数和全局函数的方式实现,代码如下:重载运算符的行为应该和内置类型一致,所以前置的++、--应该返回引用。
#include<iostream>
using namespace std;
class Test {
friend Test & operator--(Test &obj);
public:
Test(int a = , int b = )
{
this->a = a;
this->b = b;
}
void display()
{
cout << "a:" << a << " b:" << b << endl;
}
public:
Test & operator++()
{
this->a++;
this->b++;
return *this;
}
private:
int a;
int b;
};
Test & operator--(Test &obj)
{
obj.a--;
obj.b--;
return obj;
}
int main()
{
Test t1(, );
t1.display();
++t1;
t1.display();
--t1;
t1.display();
cout << "hello world!\n";
return ;
}
recommend:
1.赋值(=)、下标([])、调用和成员访问箭头(->)运算符必须是成员函数;
2.复合赋值运算符一般来说应该是成员,但并非必须,这一点与赋值运算符略有不同;
3.改变对象状态的运算符或者与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常应该是成员(上述代码只是为了复习训练一下全局函数和成员的分别实现,所以没有遵循这条规则);
4.具有对称性的运算符可能转换任一端的运算对象,例如算术、相等性、关系和位运算符等,因此它们通常应该是普通的非成员函数。
总结下来就是,只用记住第四点,其他情况都用成员函数的方式。
c++重载前置++和--的更多相关文章
- C++:重载前置++/--返回引用,重载后置++/--返回临时对象
标准库中iterator对++/--的重载代码如下: _Myiter& operator++() { // preincrement ++*(_Mybase *)this; return (* ...
- C++前置++与后置++的区别与重载
++属于单目运算符,前置与后置的实现代码不一样,下面以整数自增为例: // 前置++,返回自增后的值,且返回的是一个左值 int& operator++(){ *this += 1; retu ...
- C++中前置操作符和后置操作符的重载
1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++ // i 的值作为返回值,i 自增 1: ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- C++之运算符重载(2)
上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又 ...
- 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
++操作符重载 ++操作符分为前置++和后置++,比如: ++a; a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...
- c++ 前置++与后置++的区别
用C++编程的都知道,C++提供了一个非常强大的操作符重载机制,利用操作符重载,我们可以为我们自定义的类增加更多非常有用的功能.不过,C++也有限制,就是当我们为自定义的类重载操作符时,重载操作符的含 ...
- [转]C++之运算符重载(2)
上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又 ...
- C++ 运算符重载二(一元运算符重载)
//一元运算符重载 #include<iostream> using namespace std; class Point { public: Point(int x,int y){ th ...
随机推荐
- TOMCAT问题总结
迁移时间--2017年7月9日14:58:12Author:Marydon CreateTime--2016年12月25日21:55:09Author:MarydonTomcat问题总结问题一 A ...
- 使用java爬取国家统计局的12位行政区划代码
前言: 本文基于j2ee的原始url进行都写,解析指定内容时也是使用很傻的形式去查找指定格式的字符串来实现的. 更优雅的方式是可以使用apache的HttpClient和某些文档模型将HTML字符串构 ...
- 26、线性表(List)
1.List List接口是Collection的子接口,List是一个可重复集合 2.ArrayList和LinkedList ArrayList和LinkedList是List接口最常见的两个实现 ...
- Linux系统中用stat命令查看文件的三个时间属性
在Linux中,没有文件创建时间的概念.只有文件的访问时间.修改时间.状态改变时间.也就是说无法知道文件的创建时间. [root@rhel7 yum.repos.d]# stat cdrom.repo ...
- kubernetes中使用NFS创建pv_pvc
Persistent Volume(持久化卷)简称PV, 是一个K8S资源对象,我们可以单独创建一个PV, 它不和Pod直接发生关系, 而是通过 Persistent Volume Claim, 简称 ...
- JavaScript 中定义变量时有无var声明的区别
关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...
- 那些恶心人的Screen基本概念
Screen的这些基本概念中,最重要的就是dip的理解,而理解dip就是理解android适配不同设备的关键. Screen Size 实际物理尺寸.就是我们常说的3.5英寸屏幕,4.7英寸屏幕等等, ...
- python练习笔记——用函数对列表奇偶分类,且过程不增加新列表
编写一个函数:函数接收一个列表,将列表中所有的奇数,放到偶数之前,要求过程中不增加新的列表 def fun(*args): # 因为奇数放在偶数之前,标记出奇数中的偶数 # 并将该偶数取出放在数列的最 ...
- WebADI_WebADI工作日志设定(案例)
20150707 Created By BaoXinjian
- Error parsing XML: not well-formed (invalid token) 报错
鼠标右键选择Source然后再选Format 就可以解决此问题