首页 > 编程语言 >C++逆向分析——运算符重载

C++逆向分析——运算符重载

时间:2023-08-02 18:35:07浏览次数:35  
标签:int res Number C++ 运算符 operator 重载

运算符重载

现在有一个类,其中有一个函数用于比较2个类的成员大小:

#include <stdio.h>
 

class Number {


private:


int x;


int y;


public:


 Number(int x, int y) {


this->x = x;


this->y = y;

 }

int Max(Number& n) {


returnthis->x > n.x && this->y > n.y;

 }
};
 

void main() {


 Number a(3,4),b(1,2);


int res = a.Max(b);


 printf("%d \n", res);


return;

}

C++逆向分析——运算符重载_运算符重载

但是在这里,我们只是比较一下大小,确实用int类型,这有点浪费了,在C++中有一个类型叫bool类型,其返回就是真(1)、假(0),所以我们可以使用这个数据类型。

C++逆向分析——运算符重载_Max_02

bool类型仅占用一个字节:

C++逆向分析——运算符重载_Max_03

这样比较大小,多少还是有点麻烦,如果我们想实现跟其他的数一样直接比较大小该怎么办?直接使用a > b明显是不行的,因为编译器根本不知道你在比较什么。

这时候我们就需要使用运算符重栽,使用关键词:operator,例如我们想重载大于符号:

#include <stdio.h>

class Number {
private:
	int x;
	int y;
public:
	Number(int x, int y) {
		this->x = x;
		this->y = y;
	}
	bool operator>(Number& n) {
		return this->x > n.x && this->y > n.y;
	}
};

void main() {
	Number a(3, 4), b(1, 2);
	int res = a > b;
	printf("%d \n", res);
	return;
}

 

只需要在自定义类里面按照格式重载运算符即可:

C++逆向分析——运算符重载_运算符_04

 

我们看下vs2022下的汇编码:

C++逆向分析——运算符重载_运算符重载_05

 

 

 

也就是说运算符重载,其本质意义就是给重新定义运算符,或者说取一个别名;其在底层上和我们之前的代码是没有任何区别的,其价值就是为了便于写代码。

重载其他的运算符:

Number operator++();
Number operator--();
Number operator+(Number& n);
Number operator-(Number& n);
Number operator*(Number& n);
Number operator/(Number& n);
bool operator<(Number& n);
bool operator==(Number& n);
bool operator>(Number& n) {

returnthis->x > n.x && this->y > n.y;

}

标签:int,res,Number,C++,运算符,operator,重载
From: https://blog.51cto.com/u_11908275/6941552

相关文章

  • C++逆向分析——多态和虚表
    虚表上一章了解了多态,那么我们来了解一下多态在C++中是如何实现的。了解本质,那就通过反汇编代码去看就行了,首先我们看下非多态的情况下的反汇编代码:然后再来看下多态情况下的反汇编代码:很明显这里多态的情况下会根据edx间接调用,而非多态则会直接调用。那么我们来看下间接调用的流程......
  • C++逆向分析——继承与封装
    面向对象程序设计之继承与封装之前已经学习过继承和封装了,但是要在实际开发中使用,光学语法和原理是不够的,在设计层面我们需要做一些优化。如下代码是继承的例子:#include<stdio.h>classPerson{public:intAge;intSex;voidWork(){printf("Person:Work()"......
  • C++逆向分析——引用
    voidmain(){intx=1;int&ref=x;ref=2;printf("%d\n",ref);return;}反汇编代码:intx=1;00724A5FC745F401000000movdwordptr[x],1int&ref=x;00724A668D45F4lea......
  • C++逆向分析——类成员的访问控制
    类成员的访问控制课外→好的编程习惯:定义与实现分开写,提升代码可读性。如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么?structStudent{intage;intsex;voidPrint1(){printf("FuncPrint1");}voidPrint(){......
  • C++逆向分析——new和delete new[]和delete[]
    在堆中创建对象我们可以在什么地方创建对象?全局变量区,在函数外面在栈中创建对象,也就是函数内在堆中创建对象注意:之前一直提到的堆栈实际上是两个概念->堆、栈,我们之前所讲的就是栈,从本章开始要严格区分。在C语言中,我们可以通过一个函数去申请一块内存,就是malloc(N);申请的这一块内存......
  • C++逆向分析——继承
    继承structPerson{intage;intsex;};structTeacher{intage;intsex;intlevel;intclassId;};如上代码中可以看见,Teacher类与Person类都存在着相同的2个成员age和sex,那么这就相当于重复编写了,我们可以通过继承的方式避免这样重复的编写(当前类名称:要......
  • C++逆向分析——this指针
    this指针概述C++是对C的拓展,C原有的语法C++都支持,并在此基础上拓展了一些语法:封装、继承、多态、模板等等。C++拓展新的语法是为了让使用更加方便、高效,这样就需要编译器多做了很多事情,接下来我们就需要一一学习这些概念。封装之前我们学习过结构体这个概念,那么结构体可以做参数传......
  • 【C++数据结构】启航,打开新世界的大门!
    @TOC一、学习数据结构的原因学习数据结构对于计算机科学和软件开发非常重要,它提供了处理和组织数据的有效方法和技术。以下是几个学习数据结构的重要原因:提高问题解决能力:数据结构教会了我们如何选择和使用适当的数据结构来解决问题。了解各种数据结构的特性和性能可以帮助我们分......
  • protobuf在c++中的使用
    一、安装sudoaptinstalllibprotobuf-devprotobuf-compiler二、编辑proto文件,生成代码文件proto语法分为“proto2”和”proto3“两个版本,指定方法是在proto文件中第一行写入:syntax="proto3";,这样指定使用proto3版本的语法,如果不指定,默认是使用proto2的语法。两个语法的......
  • C/C++ 数据结构五大核心算法之分治法
    分治法——见名思义,即分而治之,从而得到我们想要的最终结果。分治法的思想是将一个规模为N的问题分解为k个较小的子问题,这些子问题遵循的处理方式就是互相独立且与原问题相同。两部分组成:分(divide):递归解决较小的问题治(conquer):然后从子问题的解构建原问题的解三个步骤:1、......