重载前置,后置(自增运算符 ++ 和自减运算符 --)
2016-08-15 15:18
453 查看
转载自:http://blog.csdn.net/anye3000/article/details/6618495
如何重载增量运算符 ++ 和 --
运算符++和--有前置和后置两种形式,如果不区分前置和后置,则使用operator++( )或operator--( )即可;否则,要使用operator++( )或operator--( )来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。
对于“++” 和“--”这两个一元运算符,存在前置和后置的问题,在定义时必须有所区分。
(1) 用成员函数的形式来进行重载
如果++为前增量运算符时,重载函数的一般格式为:
< type > ClassName :: operator ++ ( )
{
//…
}
如果++为后增量运算符时,重载函数的一般格式为:
< type > ClassName :: operator ++ ( int )
{
//…
}
(2) 非成员函数形式的重载
以++ 为例说明
用友元函数来实现“++”运算符的重载时,前置++运算符的重载的一般格式:
friend <type> operator ++ (ClassName & );
其中,第一个参数是要实现++运算的对象。
后置++运算符的重载的一般格式:
friend <type> operator ++(ClassName &,int);
其中,第一个参数是要实现++运算的对象;而第二个参数除了用于区分是后置运算外,并没有其他意义,故起参数可有可无.
-------------------------------------------------------
[cpp] view
plain copy
#include <iostream>
#include "assert.h"
class A
{
public:
A(int i)
:m_i(i)
{
}
// ++i
A& operator++()
{
++m_i;
return *this;
}
// i++
const A operator++(int)
{
A tmp = *this;
++(*this); // Implemented by prefix increment
return A(tmp);
}
int m_i;
};
int main()
{
int i = 0;
int i1 = i++; // i1 = 0; i = 1;
int i2 = ++i; // i2 = 2; i = 1;
A a(0);
A a1 = a++; // i1 = 0; i = 1;
A a2 = ++a; // i2 = 2; i = 1;
//a++++; //avoid
//++++a; //support
assert(i1 == a1.m_i);
assert(i2 == a2.m_i);
return 0;
}
说明
1. 类中的++操作符号重载之后必须保证其语意与全局++相同。
2.为了区分前后,用++()表示前自增,用++(int)后自增。
3.因为按照前自增的标准定义,应该支持"++++a"的语法,而且两次前自增都应该是对a对象的自身操作,如果返回A类型,那第二次前自增调用的是临时对象的前自增操作。
4.后自增应该返回"const Complex".这可以防止形如"a++++"的用法。
5.一般通过前自增操作来实现后自增操作符函数。
如何重载增量运算符 ++ 和 --
运算符++和--有前置和后置两种形式,如果不区分前置和后置,则使用operator++( )或operator--( )即可;否则,要使用operator++( )或operator--( )来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。
对于“++” 和“--”这两个一元运算符,存在前置和后置的问题,在定义时必须有所区分。
(1) 用成员函数的形式来进行重载
如果++为前增量运算符时,重载函数的一般格式为:
< type > ClassName :: operator ++ ( )
{
//…
}
如果++为后增量运算符时,重载函数的一般格式为:
< type > ClassName :: operator ++ ( int )
{
//…
}
(2) 非成员函数形式的重载
以++ 为例说明
用友元函数来实现“++”运算符的重载时,前置++运算符的重载的一般格式:
friend <type> operator ++ (ClassName & );
其中,第一个参数是要实现++运算的对象。
后置++运算符的重载的一般格式:
friend <type> operator ++(ClassName &,int);
其中,第一个参数是要实现++运算的对象;而第二个参数除了用于区分是后置运算外,并没有其他意义,故起参数可有可无.
-------------------------------------------------------
[cpp] view
plain copy
#include <iostream>
#include "assert.h"
class A
{
public:
A(int i)
:m_i(i)
{
}
// ++i
A& operator++()
{
++m_i;
return *this;
}
// i++
const A operator++(int)
{
A tmp = *this;
++(*this); // Implemented by prefix increment
return A(tmp);
}
int m_i;
};
int main()
{
int i = 0;
int i1 = i++; // i1 = 0; i = 1;
int i2 = ++i; // i2 = 2; i = 1;
A a(0);
A a1 = a++; // i1 = 0; i = 1;
A a2 = ++a; // i2 = 2; i = 1;
//a++++; //avoid
//++++a; //support
assert(i1 == a1.m_i);
assert(i2 == a2.m_i);
return 0;
}
说明
1. 类中的++操作符号重载之后必须保证其语意与全局++相同。
2.为了区分前后,用++()表示前自增,用++(int)后自增。
3.因为按照前自增的标准定义,应该支持"++++a"的语法,而且两次前自增都应该是对a对象的自身操作,如果返回A类型,那第二次前自增调用的是临时对象的前自增操作。
4.后自增应该返回"const Complex".这可以防止形如"a++++"的用法。
5.一般通过前自增操作来实现后自增操作符函数。
相关文章推荐
- 重载前置,后置(自增运算符 ++ 和自减运算符 --)
- 重载前置,后置(自增运算符 ++ 和自减运算符 --)
- C++重载++ 如何区分“++”重载的前置与后置
- 实现前置与后置递增(递减)运算符的重载
- C++重载++ 如何区分“++”重载的前置与后置
- ++运算符 前置、后置 对应的汇编语言,了解整个内部过程
- 重载流插入和前置与后置自增运算符
- 自加运算符的前置与后置的重载
- 为什么自增(increment)运算符的 前置(prefix) 比 后置(postfix) 效率高?
- C++中自增和增减运算符的前置形式和后置形式
- 前置与后置运算符的区别
- ++前置,后置++ 汇编角度效率比较
- 运算符重载之前置自增运算符和后置自增运算符
- (未完成)C++ 重载后置自加运算符
- 《More Effective C++》学习心得(五) 前置和后置自增运算符
- 前置运算符和后置运算符的区别
- 前置和后置运算符
- ++前置和后置
- C++前置和后置运算符的区别
- [置顶] # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符