类
大约 3 分钟cpp
派生类
下面的代码表示 Monster 的父类是 Animal
class Monster :public Animal {
}
类的简单使用
一般将类的声明代码放在头文件中,其他 cpp 文件中通过引用该头文件使用该类型,成员函数的实现写在同名的 cpp 文件中。
#include <iostream>
#include <string>
using namespace std;
class Animal {
public:
int id = 0;
string name = "";
float x = 0, y = 0, z = 0;
Animal();// 声明构造函数,没有返回值
~Animal();// 声明析构函数
void Info();
void Move();
};
Animal::Animal() {// 实现构造函数
printf("开始创建Animal对象,");
memset(this,0,sizeof(Animal));
printf("新对象的地址:%p\n",this);// 打印新创建对象的首地址
}
Animal::~Animal() {// 析构函数
printf("Animal析构函数\n");
}
void Animal::Info() {
printf("打印Animal对象的Info\n");
}
int main()
{
std::cout << "Hello World!\n";
Animal a, b;// 声明变量即创建了对象
a.Info();
system("pause");
}
h,cpp在声明类中的作用
一般在头文件中声明成员变量和函数签名,而不实现函数,在对应的 cpp 文件中实现成员函数。
下面是类 Addr 的头文件
#pragma once
#ifndef ADDR_H
#define ADDR_H
#include <iostream>
#include <Windows.h>
using namespace std;
class Addr
{
private:
UINT_PTR addr;
public:
Addr(UINT_PTR a);
void setAddr(UINT_PTR a);
UINT_PTR getAddr();
string toString();
};
#endif
下面是类 Addr 的成员函数实现源码,cpp 文件
#include "Addr.h"
#include<sstream>
using namespace std;
// 构造函数
Addr::Addr(UINT_PTR a):addr(a) {}
void Addr::setAddr(UINT_PTR a) {
addr = addr;
}
UINT_PTR Addr::getAddr() {
return addr;
}
string Addr::toString() {
return std::to_string(addr);
}
实例化类 Addr 对象的方法,声明即创建了对象(和 java 不同)
void initAddr() {
Addr baseAddr(BASE_ADDR);
Addr offset1(OFFSET01);
Addr offset2(OFFSET02);
cout << "已初始化基址和偏移,十进制基址是:" << baseAddr.toString() << endl;
}
成员变量函数以及内联

类的对象指针

对象引用

构造函数

参数初始化表
自己试验的代码如下,下面是类 Addr 的头文件,其中只声明成员变量和成员函数(不实现)
#pragma once
#ifndef ADDR_H
#define ADDR_H
#include <iostream>
#include <Windows.h>
using namespace std;
class Addr
{
private:
UINT_PTR addr;
public:
Addr(UINT_PTR a);
void setAddr(UINT_PTR a);
UINT_PTR getAddr();
string toString();
};
#endif
下面是类 Addr 的 cpp 文件,在其中实现成员函数
#include "Addr.h"
#include<sstream>
using namespace std;
// 构造函数
Addr::Addr(UINT_PTR a):addr(a) {}
void Addr::setAddr(UINT_PTR a) {
addr = addr;
}
UINT_PTR Addr::getAddr() {
return addr;
}
string Addr::toString() {
return std::to_string(addr);
}
下面演示创建类 Addr 对象的方法,声明的时候传入参数,不像 java 要通过 new 创建对象,此处也正好说明了 c++ 中声明变量即创建了对象
void initAddr() {
Addr baseAddr(0x006A9EC0);
Addr offset1(0x768);
Addr offset2(0x5560);
cout << "已初始化基址和偏移,十进制基址是:" << baseAddr.toString() << endl;
}
特别注意
c++ 中定义类时注意不可声明当前类类型的属性,原因是源码中定义对象时就创建了对象的实例,如果允许本类类型的属性就会导致无限递归创建对象,而 java 是通过 new 创建对象的就不受本条的限制。但是可以有本类类型的引用属性,即 Addr *child
