c++重载后置++和--

c++语言并不要求递增和递减运算符必须是类的成员,但是因为它们改变的正好是所操作对象的状态,所以建议将其设定为成员函数。(但下面的代码为了练习,还是分别采用成员函数和全局函数的方式实现)

业余实现代码:

 1 #include<iostream>
 2 using namespace std;
 3 class Test {
 4     friend Test & operator--(Test &obj);
 5     friend Test operator--(Test &obj, int);
 6 public:
 7     Test(int a = 0, int b = 0)
 8     {
 9         this->a = a;
10         this->b = b;
11     }
12     void display()
13     {
14         cout << "a:" << a << " b:" << b << endl;
15     }
16 public:
17     //前置++
18     Test & operator++()
19     {
20         this->a++;
21         this->b++;
22         return *this;
23     }
24     //后置++
25     Test operator++(int)
26     {
27         Test temp = *this;
28         this->a++;
29         this->b++;
30         return temp;
31     }
32 private:
33     int a;
34     int b;
35 };
36 //前置--
37 Test & operator--(Test &obj)
38 {
39     obj.a--;
40     obj.b--;
41     return obj;
42 }
43
44 //后置--
45 Test operator--(Test &obj,int)
46 {
47     Test temp = obj;
48     obj.a--;
49     obj.b--;
50     return temp;
51 }
52 int main()
53 {
54     Test t1(1, 2);
55     t1.display();
56     ++t1;
57     t1.display();
58     --t1;
59     t1.display();
60     Test t2(3, 4);
61     t2.display();
62     t2++;
63     t2.display();
64     t2--;
65     t2.display();
66     cout << "hello world!\n";
67     return 0;
68 }

NOTE:

后置版本接受一个额外的参数(不被使用)int类型的参数(必须是int类型的)。当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参。尽管从语法上说后置函数可以使用这个额外的形参,但在实际过程中通常不会这样做。这个形参的唯一作用就是区分前置和后置版本的函数,而不是真的要在实现后置版本是参与运算。因为前置和后置版本的递增或者递减函数原型必须加以一个特殊的区分,c++语言选择增加一个占位参数实现后置版本。

如果我们想要通过函数的方式调用后置版本,则必须为它的整形参数传递一个值。

eg:

a.operator++(0);//调用后置版本,经测试,不用0也行,只要可以转换成int的任意数。

a.operator++();//调用前置版本

专业软件工程师实现方法:

 1 #include<iostream>
 2 using namespace std;
 3 class Test {
 4     friend Test & operator--(Test &obj);
 5     friend Test operator--(Test &obj, int);
 6 public:
 7     Test(int a = 0, int b = 0)
 8     {
 9         this->a = a;
10         this->b = b;
11     }
12     void display()
13     {
14         cout << "a:" << a << " b:" << b << endl;
15     }
16 public:
17     //前置++
18     Test & operator++()
19     {
20         this->a++;
21         this->b++;
22         return *this;
23     }
24     //后置++
25     Test operator++(int)
26     {
27         Test temp = *this;
28         ++*this;
29         return temp;
30     }
31 private:
32     int a;
33     int b;
34 };
35 //前置--
36 Test & operator--(Test &obj)
37 {
38     obj.a--;
39     obj.b--;
40     return obj;
41 }
42
43 //后置--
44 Test operator--(Test &obj,int)
45 {
46     Test temp = obj;
47     --obj;
48     return temp;
49 }
50 int main()
51 {
52     Test t1(1, 2);
53     t1.display();
54     ++t1;
55     t1.display();
56     --t1;
57     t1.display();
58     Test t2(3, 4);
59     t2.display();
60     t2++;
61     t2.display();
62     t2--;
63     t2.display();
64     cout << "hello world!\n";
65     return 0;
66 }

同样的思路在==和!=中也会用到(善于利用现有资源)^_^。

时间: 2024-11-04 10:11:40

c++重载后置++和--的相关文章

C++中前置操作符和后置操作符的重载

1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: 2,++i  // i 自增 1,i 的值作为返回值: 3,没有使用返回值,由于编译器(不同的编译器都是一样的)的优化,在工程上面,这两行代码没有区别: 2,真的有区别吗?编程实验: 1,main.cpp 文件: 1 #include <iostream> 2 #include <stri

第四十课、前置操作符和后置操作符

一.i++和++i有没有区别? 1.现代编译器产品会对代码进行优化 2.优化使得最终二进制程序更加高效 3.优化后的二进制程序丢失了c/c++的原生语义 4.不可能从编译后的二进制程序还原c/c++程序 //由此可知,单行的i++和++i在汇编层的代码完全一样 int i = 0; 0123136E mov dword ptr [i],0 i++; 01231375 mov eax,dword ptr [i] 01231378 add eax,1 0123137B mov dword ptr [

第40课 前置操作符和后置操作符

1. ++i和i++真的有区别吗? (1)现代编译器会对代码进行优化.对于基础类型,前置++和后置++的汇编代码几乎是一样的,最终效率完全一样. (2)优化使得最终的二进制程序更加高效 (3)优化后的二进制程序丢失了C/C++的原生语义. (4)不可能从编译后的二进制程序还原C/C++程序. int i = 0; 013612FB mov dword ptr [i],0 i++; 01361302 mov eax,dword ptr [i] 01361305 add eax,1 01361308

C++--前置操作符与后置操作符

一.前置操作符与后置操作符 Q:下面的代码有没有区别?为什么?代码的实现 #include <iostream> #include <string> using namespace std; int main() { int i = 0; i++; ++i; return 0; } 意想不到的事实1.现代编译器都会对代码进行优化2.优化使得最终的二进制程序更加高效3.优化后的二进制程序丢失了C/C++的原生语义4.不可能从编译后的二进制程序还原C/C++程序 Q:++操作符可以重载

前置后置单目运算符重载函数返回值用法

Clock& Clock::operator ++() //前置单目运算符重载函数{Second++;if(Second>=60){Second=Second-60;Minute++;if(Minute>=60){Minute=Minute-60;Hour++;Hour=Hour%24;}}return *this;}//后置单目运算符重载Clock Clock::operator ++(int) //注意形参表中的整型参数{Clock old=*this;++(*this);retu

前置和后置自增以及解引用重载函数(++、--、*)

#include<iostream> using namespace std; class INT { private: int m_i; public: INT(int i):m_i(i){} // 区分前置和后置自增重载函数的区别是是否有参数,以及参数的个数 // 如果是前置自增,比如++a,因为++符号前面没有变量,于是重载函数也就没有参数 INT& operator++() { ++(this->m_i); return *this; } const INT operat

前置++与后置++运算符重载

前置++与后置++运算符重载,前置--与后置--运算符同理 complex& operator++(complex& c1) { c1.a++; c1.b++; return c1; } complex& operator++(complex& c1, int)//占位符区分前置还是后置 { complex temp = c1; c1.a++; c1.b++; return temp; } 原文地址:https://www.cnblogs.com/jly594761082/

前置后置自增自减操作

class Int { friend ostream& operator<<(ostream& os, const Int& i); friend istream& operator>>(istream& is, Int& i); friend bool operator<(const Int& a, const Int& b); private: int value; public: Int():value(0

(转)前置++和后置++的区别

今天在阅读<google c++ 编程风格>的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意: 对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理由是 前置自增 (++i) 通常要比后置自增 (i++) 效率更高.于是我查了查前置++和后置++的区别. 注意:<more effective c++>条款8也专门叙述了问题.后来我发现,下面的文章基本就是它的翻版,哈哈 前置++和后置++的区别 <C专家编程>中有如下描述(P276