跳至主要內容

chanchaw大约 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