C++编码规范
来源:互联网 发布:linux回到根目录命令 编辑:程序博客网 时间:2024/06/10 04:18
头文件
一般情况下,每.CPP
文件应该有一个相关的·h
文件。有一些常见的例外,如单元测试代码和只包含一个main
函数的cpp
文件。
正确使用头文件在可读性,文件大小和性能上有很大差异。
下面的规则将指导您绕过头文件使用中的各种陷阱。
define用法
所有头文件应该由#define
防护,以避免多重包含。符号名称的格式应该是<PROJECT>_<PATH>_<FILE>_H_
。
为了保证唯一性,它们应根据在项目的源代码树的完整路径。例如,在文件中FOO项目cocos2dx/sprites_nodes/CCSprite.h
应具有以下防护:
#ifndef COCOS2DX_SPRITE_NODES_CCSPRITE_H_#define COCOS2DX_SPRITE_NODES_CCSPRITE_H_...#endif // COCOS2DX_SPRITE_NODES_CCSPRITE_H_
前向声明的定义:有些时候我们可以声明一些类但是并不去定义它,当然这个类的作用也很有限了。
比如class foo;
声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,具有哪些操作)都不知道。
因此这个类的作用也很有限.
(1)不能定义foo类的对象。
(2)可以用于定义指向这个类型的指针或引用。(很有价值的东西)
(3)用于声明(不是定义)使用该类型作为形参或者返回类型的函数。
一个黄金法则是不要内联超过10行的函数。要小心析构函数,因为隐含成员和基类的析构函数,它们通常比看上去的要长。
另一个黄金法则:通常不建议内联带循环或者switch
语句的函数(除非,大部分情况下,循环或者switch
语句不会被执行)
内联命令空间自动地将名字置于封闭作用域。例子如下:
namespace X {inline namespace Y { void foo();}}
X::Y::foo()
和X::foo()
是一样的。内联命名空间是为了兼容不同版本的ABI而做的扩展。
结构体 vs 类
仅当只有数据时使用struct
,其它一概使用class
。
在C++中,关键字struct
和class
几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。
struct被用在仅包含数据的消极对象(passive objects)上,可能包括有关联的常量,但没有存取数据成员之外的函数功能,而存取功能通过直接访问实现而无需方法调用,这里提到的方法是指只用于s处理数据成员的,如构造函数、析构函数、Initialize()、Reset()、Validate()。
如果需要更多的函数功能,class
更适合,如果不确定的话,直接使用class
。
为了与STL保持一直,仿函数(functors)和特性(traits)可以不用class
而是使用struct
。
注意:类和结构体的成员变量使用不同的命名规则。
多重继承
真正需要用到多重实现继承(multiple implementation inheritance)的时候非常少,只有当最多一个基类中含有实现,其他基类都是以Interface
为后缀的纯接口类时才会使用多重继承。
定义 多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。
优点: 相比单继承,多重实现继承可令你重用更多代码(参考继承章节)。
缺点: 真正需要用到多重实现继承的时候非常少。当多重实现继承看上去是不错的解决方案时,通常可以找到更加明确、清晰的、不同的解决方案。
结论: 只有当所有超类(superclass
)除第一个外都是纯接口类时才能使用多重继承。为确保它们是纯接口,类必须以Interface
为后缀。
声明顺序
在类中使用特定的声明顺序:public:
在private:
之前,成员函数在数据成员(变量)之前等等。
类的各部分定义顺序如下:首先是public:
部分,然后是protected:
部分,最后是private:
部分。如果其中某部分没有,直接忽略即可。
在上述任何部分内,声明需要遵循以下顺序:
Typedefs
和Enums
- 常量(
static const
类型的数据成员) - 创建函数(
createXXX
方法) - 构造函数
- 析构函数
- 成员方法,包括静态方法
- 重写方法(overridden methods,必须以
override
关键字作为后缀) - 数据成员(
static const
数据成员除外)
- 编码规范,objective-c编码规范
- C语言编码规范
- C/C++ 编码规范
- C#编码规范
- C#编码规范
- C/C++编码规范
- C编码规范
- C编码规范
- C/C++编码规范
- C/C++编码规范
- C/C++编码规范
- C语言编码规范
- C语言编码规范
- C语言编码规范
- objective-c 编码规范
- C/C++编码规范
- C语言编码规范
- c语言编码规范
- Linux Mint 17.2 文本编辑器中文乱码问题
- C++设计模式之桥接模式
- Fiddler(二) - 使用Fiddler做抓包分析
- poj1020 dfs
- Jenkins+Gradle实现android开发持续集成、打包
- C++编码规范
- 查找算法3-2
- 141. Linked List Cycle
- Activity之间的数据交互
- R语言实现常用算法
- Android事件传递机制(一)
- 航电OJ-2544最短路
- Scrapy见面第五天
- 对移动医疗浅陋的理解