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++中,关键字structclass几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。

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:部分。如果其中某部分没有,直接忽略即可。

在上述任何部分内,声明需要遵循以下顺序:

  • TypedefsEnums
  • 常量(static const类型的数据成员)
  • 创建函数(createXXX方法)
  • 构造函数
  • 析构函数
  • 成员方法,包括静态方法
  • 重写方法(overridden methods,必须以override关键字作为后缀)
  • 数据成员(static const数据成员除外)
学习过程中胡乱整理的,备忘

0 0
原创粉丝点击