函数
class CMaxUserlevel
{
public:
CMaxuserLevel();//构造函数
virtual ~CMaxUserlevel();//析构函数
CMaxUserLevel(const CMaxUserlevel &src);//拷贝函数
CMaxuserLevel &operator = (const CMaxUserLevel &src);//赋值函数
}
为什么基类的析构函数用虚函数
在实现多态时,当用基类操作派用类,在析构时防止只析构基类而不析构派生类的状况发生。
析构函数与构造函数相反,当对象结束其生命周期时(例如对象所在函数已被调用完毕),系统自动执行析构函数。析构函数往往做"清理工作"(在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中delete函数)
C++
包含构造函数和析构函数的C++程序
#include <string.h>
#include <iostream>
using namespace std;
class stud//声明一个类
{
private ://私有部分
int num;
char name[10];
char sex;
public://共有部分
stud(int n,const char nam[],char s)//构造函数
{
num = n;
strcpy(name, nam);
sex = s;
}
~stud()//析构函数
{
cout<<"stud has been destructed!"<<endl;//通过输出提示来告诉我们析构函数确实被调用了
}
void display()//成员函数,输出对象的数据
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
};
ER
连接服务器
GS
处理跟场景有关,应该属于客户端场景逻辑在服务器的处理过程。话说为了防止外挂 才把客户端逻辑放到服务器去处理。
16.12.14
//客户端向服务器发送数据(后面跟发送数据参数)
BOOL OPT_ClientCommand(CERPlayer *pPlayer,int nID,int *pnParams,int nMax,LPCTSTR str)
{
}
//测试断言
ASSERT(g_pScnSvr != NULL);
//计算字符串 段数
int nose = GetSegmentCount(szParm);//计算命令字符串段数
//头文件宏定义:防止头文件被重复引用
#ifndef GRAPHICS_H // 防止graphics.h被重复引用
#define GRAPHICS_H
#include <math.h> //引用标准库的头文件
#include “header.h” // 引用非标准库的头文件
void Function1(…); // 全局函数声明
class Box // 类结构声明
{
…
};
#endif
那么问题来了ifdef endif
到底是干啥的
在C/C++语言中,意思是说如果你定义了某个东西,则执行一段代码,这段代码是包含在
ifdef
到endif
之间的。比如debug
一个程序,但是到最后你需要将debug的代码的删除,很多则麻烦。但是如果你那些debug的测试都是包含在ifdef和endif中的,便只需要将DEBUG注释掉就行了。
一、关键字:#ifndef,#define,#endif可以防止头文件被重复引用
结构是这样的:
如a.h头文件
#ifndef XX
#define XX
// 函数声明
#endif
第一次include这个头文件的时候由于XX还没有被define,所以满足#ifndef XX这个判断
那么执行它下面的内容 #define XX和他下面的函数声明;
如果由于编码者的不小心或者嵌套包含造成了这个头文件被多次引用;那么当编译到第二次#inlude的地方的时候由于不满足 #ifndef XX这个判断条件所以不执行后面的内容(#define XX和函数声明都不走)直接跳到#endif因此可以很好的防止头文件被重复引用
二、#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:
#include "x.h"
#include "x.h"
显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:
#include "a.h"
#include "b.h"
看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在此也同样被包含了两次,只不过它的形式不是那么明显而已。
多重包含在绝大多数情况下出现在大型程序中,它往往需要使用很多头文件,因此要发现重复包含并不容易。要解决这个问题,我们可以使用条件编译。如果所有的头文件都像下面这样编写:
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
...
#endif
那么多重包含的危险就被消除了。当头文件第一次被包含时,它被正常处理,符号_HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号_HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。
但是,你必须记住预处理器
仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将减慢编译速度,所以如果可能,应该避免出现多重包含
strlen和sizeof的区别与联系
C/C++语言中:strlen指字符的长度,sizeof只文件或数据占的内存(字节)
1.
FH_ASSERT(Strlen(sap[1])<sizeof(sap[1]),"字符串越界!");
2.
int nCount = GetSegmentCount(szParam);
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所有建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以是类型做参数,strlen只能用char * 做参数,且必须是以"\0"结尾的。sizeof还可以用函数
4.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址
5.ASSERT函数:
断言assert是一个宏,该宏在<assert> 中,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止的。
我们一般可用在判断某件操作是否成功上。
程序一般分为Debug版本和Release版本,Debug版本用于内部测试,Release版本发行给用户使用。如果assert的参数为假,那么程序就会终止(一般地还会出现提示对话,说明在什么地方引发了assert)