类的转换
前言按照常规,类之间转换是通过副本构造函数,也可以叫拷贝函数实现。
正文1234567class Object{public: int data_0 = 1; int data_1 = 2; int data_2 = 3; int data_3 = 4;};
连续的内存,只要能知道data_0的内存地址,后面三个偏移一下也就得到了。
1234567891011int main(){ Object obj; int *readO = (int *)&obj; std::cout << "obj地址:" << &obj << std::endl; for (int i = 0; i < sizeof(obj); i++){ std::cout << "内存地址: " << &readO[i] << "值:" << readO[i] << std::endl ...
理解继承
前言相对而言了解了继承在构造函数和析构函数时执行的区别。包括函数重命名时作用域区分的时候。
正文多重继承从生理学角度,一个儿子就一个爹。但是子类比较特殊,它可以拥有多个父类
12345678910111213class pople{public: pople(){ std::cout << "pople created\n"; }};class wolf{public: wolf(){ std::cout << "wolf created\n"; }};
当狼和人组合,产生子类狼人
123456class werewolf:public pople,public wolf{public: werewolf(){ std::cout << "werewolf created\n"; }};
继承方式无所谓,一般都public,父类名由逗号分隔。
实例化类,能看 ...
派生类的析构函数和重名问题
前言析构函数其实挺好猜,毕竟就一个,也没有重载。
正文析构函数函数A->B->C它的析构函数其实可以猜一猜顺序。
123456789101112131415161718192021222324252627282930313233343536373839404142434445class father{public: int x; int y; father(){ std::cout << "father created\n"; } father(const father &f){ std::cout << "father copy created\n"; } ~father(){ std::cout << "father delete\n"; }};class son :public father{public: int age; son(){ std::c ...
派生类的构造函数
前言类的构造函数如果没有特别定义,则会使用默认的构造函数,即空的情况,调用了也没变化。
正文构造函数1234567891011121314151617#include<iostream>class father{public: int x; int y; father(){ std::cout << "father created\n"; }};int main(){ father fh; return 0;}
当实例化一个类的时候,然后我们特定构造函数有输出。
这便是最常见的情况。
那么当类的派生类出现的时候,实例化这个派生类,会调用什么构造函数
12345678910111213141516class father{public: int x; int y; father(){ std::cout << "father created\n"; }};class son :public fat ...
派生类的访问
回顾类中有三种属性划分
12345class Box{public: //公有private: //私有protected: //受保护的}
而前面继承的时候我们都用的public,其实其他两种也能使用。只不过访问方式就产生变化了。
正文123class Box : 属性 基类{}
三种继承属性*三种成员属性。它的访问方式就变得复杂了。
public123class Box : public 基类{}
这个时候,就是之前学的状态。公有都基类派生类可以访问私有只有基类可以访问受保护的基类可以访问、派生类只能由成员函数访问
protected123class Box : protected 基类{}
如果继承方式变成protected。访问的权限就又变了。public就变成了protected。然后私有还是私有。以之前的例子:
1234567891011121314151617class father{public: ...
类的继承
前言我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。
123class<派生类名>:<继承方式><基类名>{<派生类新定义成员>};
正文123456789101112class father{public: char name[20];};class son{public: char name[20]; int age; float weight; //。。。。。};
像这种其实有共同属性的时候,就可以通过继承。
子类不能继承父类的构造函数、析构函数、重载赋值运算符
子类只能继承父类的成员变量以及常规成员函数
12345678910class father{public: char name[20];};class son: public father{public: int age; float weight;};
如何看是否 ...
重载new/delete
前言之前说的都是运算符重载,new/delete可能谁都不会想到跟运算符相关
正文看上去是个关键字,但分配内存也是跟运算相关。
至于游戏上的优化,大多都是内存上的优化,比如道具交互,枪械打架,都需要存储,然后取值计算。但是一个子弹类,都有不少因素,就导致计算的时候要考虑很多。那么计算量大了,内存频繁读写,就会导致速度降低了。当然现在的机器配置基本都挺高了。这种轻量的他还是能处理的。
123456789101112131415161718#include<iostream>class bullet{public: float x; float y; float z; float damage;};int main(){ bullet *shota = new bullet(); delete shota; return 0;}
最常见的就是这样的,之所以动态分配,因为栈区一般都不大,没必要让这些都堆积在栈区,而且子弹用完就释放,除非换弹夹重新拉满。还有一个原因,内存碎片,内存释放了,原有的内存就会空白留间隙,如果这个地 ...
重载递增递减运算符
前言递增递减就是通过++、--两个运算符。不过它有特殊的地方就是可以放前面也可以放后面。区别就是先递增后传值,和先传值后递增。
正文前置++/–1234567//方法返回类型 operator++();返回类型 operator--();//全局函数返回类型 operator++(操作数类型 操作数);返回类型 operator--(操作数类型 操作数);
这就拿之前的hint类做试验了。
12345678910111213141516#pragma onceclass hint{private: char *mem[4];public: hint(int _val = 0); operator int(); void operator=(int _val); hint &operator++(); ~hint();};hint &operator--(hint &_val);
一个做成员一个做全局。
123456789hint &hint::operator++(){ *this = *this + ...
【软件】内存修改-CE基础
前言因为游戏的某些数据是有可能存放到本地的,就导致可以通过一些工具检索出内存然后修改。这也是之前单机游戏歪瓜来的方式之一。
引用
Cheat Engine工具下载
软件汉化文件也在官网download下面,有个ch_cn的中文简单,不会的用谷歌浏览器或者edge翻译软件本身安装的时候有个教程,挺好的可以学一下。
正文1234567891011121314#include<iostream>int diamond = 2500;int main(){ while (true){ std::cout << "钻石数量:" << diamond; system("pause"); diamond -= 10; } return 0;}
随便写个,就是让钻石每次减少,反正就是变量自减的问题去模拟消费的时候。
效果大概就是这样,每次回车减10。
然后打开ce工具。去找到这个执行的exe程序
问题我的开发环境
win11
vs2022
系统用户默认是管理员 ...
重载类型转换1
前言在类型转换重载函数前加explicit关键字可以限制该函数禁止使用隐式转换[c++11标准]explicit operator int();在正常类型直接,比如float x 等于一个 int类型的变量,就会自动发生隐式转换简称隐转,目前就是当类型不同时方便运算。规则好像就是整数由小转大,整数和浮点数比较转浮点。
正文12345678910111213141516171819#include<iostream>class Box{public: Box(int _val){} operator int(){ return 1; } int operator+(Box b){ return 2; }};int main(){ Box b1{ 100 }, b2{ 200 }; int x = b1 + 100; return 0;}
编译器给了报错愿意在于,我们有两个重载,编译器就不能判断是把b1转成int还是把后面的 ...