1.类的写法
class name{
public://公有的
//成员
private://私有的
//成员
protected://保护性继承
//成员
};
2.一些常用类函数
class A{
public:
A();//构造函数
A(int a,int b);//含参构造函数
A(const A & p);//复制构造函数
~A();//析构函数
};
//类里的成员 除了各种类型的数值 还可以是函数
①.构造函数 这个函数是自带的,当调用这个类的时候便会被启动,不写也没关系,但是写了之后。系统不再提供默认附带
例子 .cpp
A o;//调用了构造函数 类名 任意;
A p(1,2);//调用了对应参数的构造函数
A t(p);//等同于 A t=p; 会调用复制构造函数
//【特别注意!】 A t; t=p;这样的写法是错误的!这会调用另一个叫做赋值函数的函数
3.关于复制构造 以及 析构函数
①.浅复制
一般来说 如果我们不定义复制构造函数,系统也会自动生成。但这会造成一些问题,当他复制的时候就连地址也一起复制过去了。所以当被复制对象是数组或者指针 就会造成一定的问题[编译器解析的时候,会自动把数组解析成指针]
【出现错误原因是内存泄漏 假设系统回收了a的内容,复制a内容的b地址也将被回收,b就成为了一个野指针】
②.深复制
一般我们使用 new来管理深复制,要特别小心指针的赋初始值!
例子:
` A():f(char*g){};`
当我们这样去写的时候 本意是想把值传递给另一个指针,但却复制了地址!如此造成内存泄漏
[深复制就是从新写复制函数 然后new出来地址,注意 用new出来的地址 都要用delete删除!]
③.析构函数 一般用不着 主要来处理 new出来的成员
4.其他的一些补充
对于 不是放在堆上的 ,而是槎里面的 会被系统自动回收的,内存。
他们的生命在遇到的第一个{开始,第一个}结束 要特别注意
5.一些代码参考
1.
.h
class GoDOM {
public:
GoDOM();
GoDOM(int x);
static int huoqu_a(GoDOM g);
GoDOM(int x,int y);
GoDOM(char *d, int x, int y, int z);
//GoDOM(int x,int y,int z);
GoDOM(const GoDOM & p);
~GoDOM();
private:
int a;
int b, c;
char * dom = nullptr;
//设置成空指针
};
.cpp
#include "stdafx.h"
#include
using namespace std;
void main() {
GoDOM yo;
char *r = "Hello Word";
GoDOM k(r,1,2,3);
GoDOM U(k);
GoDOM G(U);
}
GoDOM::GoDOM(int x) {
a = x;
}
int GoDOM::huoqu_a(GoDOM g) {
return g.a;
}
GoDOM::GoDOM() {
}
GoDOM::GoDOM(int x, int y) {
b = x;
c = y;
}
GoDOM::GoDOM(char *d, int x, int y, int z):a(x),b(y),c(z) {
//cout << d << endl;
//dom = d;
int len = strlen(d);
dom = new char[len+1];
strcpy(dom, d);
//【小心浅复制 错误原因:指针 直接复制 很容易复制的是地址,并非里面的值】
}
GoDOM::GoDOM(const GoDOM & p):a(p.a),b(p.b),c(p.c) {
cout <
//cout << "???" << endl;
if (dom != NULL) {
dom = NULL;
}
//cout <<">????" << endl;
//错误原因 根本就捕捉不到这个长度
int len = strlen(p.dom);
//cout << len << endl;
dom = new char[len + 1];
strcpy(dom, p.dom);
}
//如何输出这个指针所储存的数据
GoDOM::~GoDOM() {
if (dom!=NULL) {
//cout <<"sdf" << endl;
delete dom;
}
}
=============================================================================================
2.
Enemy.h
#pragma once
#include
#include
using namespace std;
enum EnemyActionType
{
Walk = 1,
Jump,
Fly
};
//一个枚举 对应值 是 walk 1 jump 2 fly 3
class Enemy
{
friend class EnemyManager;
//当时没有添加friend 怎么还可以调用这里面的 私有东西?
private:
__int32 __Id;
string __Name;
__int16 __Health;
EnemyActionType __MyType;
protected:
EnemyActionType GetType();
//[????]
public:
//构架函数
Enemy();
//含参
Enemy(EnemyActionType Type, string Name, __int16 Health);
//复制函数
Enemy(const Enemy & enemy);
//析构了
~Enemy();
//这些都是一般的
__int32 GetId();
void SetName(string Name);
string GetName();
void SetHealth(__int16);
__int16 GetHealth();
};
EnemyManager.h
#pragma once
//#define M(a,b) a+b
#define E_M_Instance EnemyManager::GetInstance()
//[用法详细????]
class Enemy;
class EnemyManager
{
private:
Enemy * EnemyList[4];
//敌人名单 这是一个对于Enemy 的 数组指针
Enemy * SpecialEnemy;
//特殊敌人 这是一个对于Enemy 的 指针
public:
//构造函数
EnemyManager();
//析构函数
~EnemyManager();
static EnemyManager * GetInstance();
//就是一个类的 函数指针
//<----------↓这是普通的在类里面的函数↓------------->
void CreateEnemys();
//创造敌人
void ShowEnmeysId();
//敌人ID
void ShowEnemysName();
//敌人名字
void HP();
};
EnemyManager.cpp
#include "stdafx.h"
#include "EnemyManager.h"
#include "Enemy.h"
//extern int a;
EnemyManager::EnemyManager()
{
//cout <<"opopopop ::" << endl;
//EnemyList;
}
EnemyManager::~EnemyManager()
{
for (int i = 0; i < 4; ++i)
{
//cout << "d sd :" << i << endl;
delete EnemyList[i];
}
}
EnemyManager * EnemyManager::GetInstance()
{
static EnemyManager enemyManager;
//cout << "sadfadf sd fd fsdf df " << endl;
return &enemyManager;
}//[???] 被调用三次
void EnemyManager::CreateEnemys()
{
for (int i = 0; i < 3; ++i)
{
EnemyList[i] = new Enemy();
}//从这里开始索要内存了。。
EnemyList[3] = new Enemy(Fly, "King", 200);
//cout << EnemyList[3] << endl;
//自己定义的第三个
//Enemy *enemy = EnemyList[3];
//Enemy enemy2 = *&*enemy;
//[??????]
//cout << *(EnemyList[3]) << endl;
//cout << SpecialEnemy << endl;
//SpecialEnemy = EnemyList[3];
//SpecialEnemy = &enemy2;
//把值给了Enemy [为什么新地址就错了??]
Enemy enemy = *(EnemyList[3]);
//cout << &enemy << endl;
SpecialEnemy = &enemy;
//Enemy *enemy();
//cout << IdCount<< endl;
//cout << a << endl;
//cout << M(1, 2) << endl;
cout << "Show Enemy Id : " << SpecialEnemy->GetId() << endl;
//cout << SpecialEnemy << endl;
cout << "Show Enemy Name : " << SpecialEnemy->GetName().c_str() << endl;
}
void EnemyManager::ShowEnmeysId()
{
for (int i = 0; i < 4; ++i)
{
cout << "Show Enemy Id : " << EnemyList[i]->GetId() << endl;
}
//cout << SpecialEnemy << endl;
//cout << "Show Enemy Id : " << SpecialEnemy->GetId() << endl;
//cout << "Show Enemy Id : " << SpecialEnemy->GetHealth() << endl;
}
void EnemyManager::ShowEnemysName()
{
for (int i = 0; i < 4; ++i)
{
cout << "Show Enemy Name : " << EnemyList[i]->GetName().c_str() << endl;
}
//cout << "Show Enemy Name : " << SpecialEnemy->GetName().c_str() << endl;
//c_str() 以 char* 形式传回 string 内含字符串
}
void EnemyManager::HP(){
for (int i = 0; i < 4; ++i)
{
cout << "Show Enemy HP : " << EnemyList[i]->GetHealth()<< endl;
}
}
Enemy.cpp
#include "stdafx.h"
#include "Enemy.h"
static __int32 IdCount = 0;
//一个静态全局变量 生命周期仅限于这个.cpp
//int a;
//【】
Enemy::Enemy()
{
__Id = IdCount += 1;
__Name = "enemy";
__Health = 10;
__MyType = Walk;
}
Enemy::Enemy(EnemyActionType Type, string Name, __int16 Health) :
__MyType(Type), __Name(Name), __Health(Health)
{
__Id = IdCount += 1;
//cout << __Id << endl;
//cout << __Id << endl;
}
//从枚举里边调用了一个状态值 MyType 然后字符串 然后int 这个用来覆初始值
Enemy::Enemy(const Enemy & Enemy)
{
//cout << "copy function" << endl;
__Id = IdCount += 1;
__Name = Enemy.__Name;
__Health = Enemy.__Health;
__MyType = Enemy.__MyType;
//cout << __Id << endl;
//cout << __Name << endl;
//a = 998;
}
Enemy::~Enemy()
{
//cout << "Enemy release id:"<<__Id << endl;
}
EnemyActionType Enemy::GetType()
{
cout << "ovo d sd fsd fd fsd fd :"<< endl;
return __MyType;
}// 没有被调用。。。
__int32 Enemy::GetId()
{
//cout << __Id << endl;
return __Id;
}
//[【被调用了】]
void Enemy::SetName(string Name)
{
__Name = Name;
cout << ">>??????DSFASDF sdf d f" << endl;
}
string Enemy::GetName()
{
//cout << ">>??????DSFASDF sdf d f" << endl;
return __Name;
}
//[【被调用了】]
void Enemy::SetHealth(__int16 Health)
{
cout << ">>??????DSFASDF sdf d f" << endl;
__Health = Health;
}
__int16 Enemy::GetHealth()
{
//cout << ">>??????DSFASDF sdf d f" << endl;
return __Health;
}
CplusTeach.cpp
// CPlusTeach.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
//#include "targetver.h"
#include
#include
#include
using namespace std;
//#include "WeiYunsuan.h"
//#include "ZhiZhen.h"
//#include "Functions.h"
//#include "FunctionTemplate.h"
//#include "TeachHong.h"
#include "EnemyManager.h"
int main()
{
//ZiFuChuan();
//ShowPoint();
//CallFunctions();
//CallFunTem();
//CallHong();
E_M_Instance->CreateEnemys();
E_M_Instance->ShowEnmeysId();
E_M_Instance->ShowEnemysName();
E_M_Instance->HP();
//int ii = 999;
//cout << ii << endl;
return 0;
}