C++类的封装

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;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值