【c++逆向 - 2】初识类

news/2024/12/20 1:07:18/

初识类

一个 demo 完事:

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;class Student {enum { SEX_LEN = 5 };string name;string id;char sex[SEX_LEN];unsigned int age;
public:Student();Student(const string &name, const string &id, const char* sex, unsigned int age);void show() const;const Student& who_age(const Student& stu) const;};int main()
{Student Bob("Bob", "20213333", "m", 18);Student Tom{"Tom", "22223333", "m", 20};Bob.who_age(Tom).show();return 0;
}Student::Student()
{name = "No";id = "No";strcpy(sex, "No");age = 0;
}Student::Student(const string &name, const string &id, const char* sex, unsigned int age)
{this->name = name;this->id = id;strncpy(this->sex, sex, SEX_LEN-1);this->age = age;
}void Student::show() const
{cout << "Name: " << name << ", "<< "id: " << id << ", "<< "sex: " << sex << ", "<< "age: " << age << endl;
}const Student& Student::who_age(const Student& stu) const
{return stu.age>age?stu:*this;
}

主要来看下 IDA,感觉识别的不是很好啊:

当然这里涉及到了 string 类了,这里后面 STL 的时候再说吧。

运算符重载与友元

运算符函数格式:operatorop(arg-list) ==> operator=() 表示重载 = 运算符

一个 demo 完事:

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;class Point {
private:int x;int y;friend ostream& operator<<(ostream& out, const Point &p);friend Point operator*(const Point& p, int n);friend Point operator*(int n, const Point& p);
public:Point() { x = 0; y = 0; }Point(int x, int y);Point operator+(const Point& p) const;Point operator*(const Point& p) const;Point operator++(); // 前置++Point operator++(int); // 后置++void show() const;
};int main()
{Point p1(2, 3);Point p2(1, 2);Point p3(4, 2);Point p = p1 + p2 * p3;p.show();Point p4 = ++p1;Point p5 = p4++;cout << "p4 = " << p4 << endl;cout << "p5 = " << p5 << endl;cout << "p5*2 = " << p5*2 << endl;cout << "2*p4 = " << 2*p4 << endl;return 0;
}Point::Point(int x, int y)
{this->x = x;this->y = y;
}Point Point::operator+(const Point& p) const
{cout << "oprator +\n";return Point(x+p.x, y+p.y);
}Point Point::operator*(const Point& p) const
{cout << "oprator *\n";return Point(x*p.x, y*p.y);
}Point Point::operator++()
{cout << "oprator ++p\n";return Point(++x, ++y);
}Point Point::operator++(int)
{cout << "oprator p++\n";return Point(x++, y++);
}ostream& operator<<(ostream& out, const Point& p)
{out << "(" << p.x << ", " << p.y << ")";return out;
}Point operator*(const Point& p, int n)
{return Point(p.x*n, p.y*n);
}Point operator*(int n, const Point& p)
{return Point(p.x*n, p.y*n);
}void Point::show() const
{cout << "(" << x << ", " << y << ")\n";
}

这里关键的地方就是对二元运算符的重载,比如在重载 * 运算符时,我们希望 2*p,但是我们知道成员函数的第一个参数才是 this 指针,所以这里通过成员函数就无法完成重载,这里就得使用友元函数。

友元有友元函数,友元类,友元成员函数,这里仅仅用到友元函数,简单来说就是友元函数与成员函数具有相同的访问私有数据的权限。

使用也很简单:

        1)加上 friend 关键字

        2)将函数声明放在类中

最后输出如下:

oprator *
oprator +
(6, 7)
oprator ++p
oprator p++
p4 = (4, 5)
p5 = (3, 4)
p5*2 = (6, 8)
2*p4 = (8, 10)

可以看到是先运算的乘法在运算的加法,所以可以知道重载运算符不改变运算符的优先级和结合性。

还有就是注意下前置++和后置++重载的区别。

类 类型转换

todo(感觉不是很重要,所以并不打算写,但是如果后面遇到的话,再回来补)


http://www.ppmy.cn/news/1284960.html

相关文章

element表格排序功能

官方展示 个人项目 可以分别对每一项数据进行筛选 注&#xff1a;筛选的数据不能是字符串类型必须是数字类型&#xff0c;否则筛选会乱排序 html <el-table :data"tableData" border height"600" style"width: 100%"><el-table-co…

自然语言处理(第16课 机器翻译4、5/5)

一、学习目标 1.学习各种粒度的系统融合方法 2.学习两类译文评估标准 3.学习语音翻译和文本翻译的不同 4.学习语音翻译实现方法 二、系统融合 以一个最简单的例子来说明系统融合&#xff0c;就是相当于用多个翻译引擎得到不同的翻译结果&#xff0c;然后选择其中最好的作为…

php 不加后缀访问

实现不带后缀访问php文件的方法&#xff1a;首先在htaccess文件中加入内容“RewriteRule ^(api/token) token.php [L]”&#xff1b;然后通过根目录下的“token.php”来接受“api/token”&#xff1b;最后修改配置文件。 考虑的做法有&#xff1a; HTTP重写技术&#xff0c;让…

SimpleCG小游戏开发系列(2)--贪吃蛇

一、前言 在之前的C语言小游戏开发系列我们已经介绍了扫雷游戏的开发&#xff0c;本篇我们继续此系列第二篇&#xff0c;同样是比较简单但好玩的一个游戏--贪吃蛇。因为有了之前的游戏框架&#xff0c;我们只需要直接搬来原来的框架即可&#xff0c;可以省去不少活。 先看看游…

【WPF.NET开发】将路由事件标记为已处理和类处理

本文内容 先决条件何时将路由事件标记为已处理预览和浮升路由事件对实例和类路由事件处理程序复合控件中的输入事件禁止 尽管对于何时将路由事件标记为已处理没有绝对规则&#xff0c;但如果代码以重要方式响应事件&#xff0c;请考虑将事件标记为已处理。 标记为已处理的路由…

【C++入门(一)】:详解C++语言的发展及其重要性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f324;️什么是C&#x1f324;️C的发展史&#x1f324;️C的重要性☁️语言的广泛度☁️C的领域⭐…

TikTok真题第7天 | 2422.使用合并操作将数组转换为回文序列、200.岛屿的个数、694.不同岛屿的个数

2422.使用合并操作将数组转换为回文序列 题目链接&#xff1a;merge-operations-to-turn-array-into-a-palindrome 解法&#xff1a; 用双指针来解决。整体思路是&#xff1a;从数组的左右两边开始看&#xff0c; 如果 nums[left] nums[right]&#xff0c;两边数字一样&am…

electron使用electron-builder进行MacOS的 打包、签名、公证、上架、自动更新

一、前言 由于electron在macOS下的坑太多&#xff0c;本文不可能把所有的问题都列出来&#xff0c;也不可能把所有的解决方案贴出来&#xff1b;本文也不太会讲解每一个配置点为什么要这么设置的原因&#xff0c;因为有些点我也说不清&#xff0c;我尽可能会说明的。所以&…