1:类的命名规则
1:类名前缀C,成员前缀m_,静态成员前缀 sm_
纯虚类 前缀I
/*
Describe:简单的描述
*/
#ifndef __XXXX__
#define __XXXX__
class CDog
{
int m_nMyLife;
};
#endif
2:全局变量 g_ int g_i5MyLife;
3:全局静态变量 sg_ static int sg_i4MyLife;
4:局部静态 s_ static int s_i4MyLife;
5:数组 arr char arrcName[12]=""; int arrnName[12]=""; arr数组前缀+类型
6:string strName;
7:局部变量 int i4Num; float fNum; double dNum;
8:指针 char *pMyLife; *要靠着p(意思是p是指针,指向int)
9:如果用"_"分隔就不要用大小写区分, 如 My_Life;
10:宏 #define MY_LIFE 全部大写 "_"隔开
11:枚举 emMyLife eMyLife; 内容 eMY_LIFE_POS1= 1,
12:结构体 stMyLife tMyLife;
13:常量 const int nMAX_LIFE; 类型+全大写,"_"分隔,与宏的区别是加了 类型
14:名字命名 应该 形容词+名词
15:一些通用的命名
a:互斥 int Getxxx(); void Setxxx();
bool Addxxx(); bool Subxxx();
b:触发事件,void Onxxxx(); 比如收到客户端 操作请求,定时器,检查事件,满足检查条件
c:检查事件 void Checkxxx();
d:是否 bool Isxxx();
e:管理类 CxxxManager{};
f:虚函数 加个前缀v bool vIsTimeOut();
g:通知 void Sendxxx(); 发送信息,单个玩家
void Broadcastxxx(); 广播指定范围内全部玩家
e:从集合里找 xxxx Findxxx(); 一般从集合里返回一个自定义类的时候,使用它
2:内联函数
inline int max(int a, int b)
{
return a > b ? a : b;
}
内联函数 不应该使用for,while之类的循环,也不应该超过10行代码,更不应该使用递归
3:前置声明
class A; //<============这就是前置声明
clas B{
public:
A *P;
}
=============================================================
#include "a.h" //<====这里只能包含A的头文件 否则 A a;报错
class A
class B{
public:
A a;
}
问题:为什么我们前置声明时,只能使用类型的指针和引用呢?
答:那是因为指针是固定大小,并且可以表示任意的类型,
而A a是需要了解A的大小的,不然是不可能知道给类B分配内存大小的,因此不完整的前置声明就不行,必须要包含a.h来获得类A的大小,A类改变同时也要重新编译类B。A *p;就不用重新编译B文件。
结论:
头文件包含其实是一件很烦琐的工作,因此能使用前置声明我们就用前置声明
在前置声明时,我们只能使用的就是类的指针和引用(因为引用也是居于指针的实现的)。
前置声明最大的好处就是『节省编译时间』
4:static
1:不要在头文件中声明static全局函数/全局变量,如果作用域仅在该文件也不要在.cpp中声明 非static全局函数/全局变量
.h
static int g_nNum; // 错误的
.cpp
int g_num; // 仅在该文件的 那么 应该 static int g_num;
2:全局static的作用域 仅在该文件头到尾
3:如果要声明需要被其他.cpp使用的如下
.h
int g_nNum ;
int getNum();
.cpp
int g_nNum =0;
int getNum(){
return 1;
}