1.构造函数的职责

构造函数中仅仅进行那些没有实际意义的初始化。由于成员变量的“有意义”的值大多不在构造函数中确定。

能够的话,使用Init()方法集中初始化为有意义的数据。

长处:排版方便,无需操心类是否初始化。

缺点:

1)在构造函数中不易报告错误,不能使用异常;

2)操作失败会造成对象初始化失败,引起不确定状态。

3)构造函数内调用虚函数。调用不会派发到子类实现中,即使当前没有子类化实现,将来仍是隐患;

4)如果有人创建该类型的全局变量,构造函数将在main()之前被调用,有可能破坏构造函数中暗含的如果条件。

假设,对象须要有意义的初始化。考虑使用另外的Init()方法并(或)添加一个成员标记来指示对象是否已经初始化。





2.默认构造函数

当一个类有成员变量又没有构造函数的时候。须要定义一个默认的构造函数,否则编译器将会自己主动生成默认构造函数。

默认构造函数更适合于初始化对象,使对象内部状态一致、有效。

编译器生成的构造函数并不会对对象进行初始化。

假设你定义的类继承现有类,而你又没有添加信的成员变量。则不须要为新类定义默认构造函数。





3.明白的构造函数

对单參数构造函数使用C++keywordexplicit。

通常,仅仅有一个參数的构造函数可被用于转换。

比如:定义了Foo::Foo(string name)跟void FooTest(Foo foo)

这个时候FooTest须要的是一个Foo对象作为參数。假设你传入的是string类型的參数的话。构造函数Foo::Foo(string name)将被调用。

而且将该字符串转换为一个Foo暂时对象传给FooTest。

为避免构造函数被调用造成隐士转换。能够将其声明为explicit。

全部单參数构造函数必须是明白的。

在类定义中,将keywordexplicit夹到单參数构造函数前。

例外:在少数情况下,拷贝构造函数能够不声明为explicit;特意作为其它类的透明包装器的类。类似情况应在凝视中明白说明。





4.拷贝构造函数

仅在代码中须要拷贝一个类对象的时候使用拷贝构造函数;不须要拷贝时应使用DISALLOW_COPY_AND_ASSIGN。

大量的类并不须要可拷贝。也不须要一个拷贝构造函数或赋值操作。

但假设你不主动声明它们。编译器会为你自己主动生成。并且是public的。

能够考虑在类的private中加入空的拷贝构造函数和赋值操作,仅仅有声明,未定义。

为了方便,能够使用宏DISALLOW_COPY_AND_ASSIGN。

//禁止使用拷贝构造函数和赋值操作的宏

//应在类的private:中使用

#define DISALLOW_COPY_AND_ASSIGN(TypeName)               \

        TypeName(const TypeName&);//拷贝构造函数         \         

        void operator=(const TypeName&)//赋值操作函数





class Foo {

 public:

  Foo(int f);

  ~Foo();

 private:

  DISALLOW_COPY_AND_ASSIGN(Foo);

};





绝大多数情况下都应该使用DISALLOW_COPY_AND_ASSIGN,假设类确实须要可拷贝,应该在类的头文件里说明原有,并适当定义拷贝构造函数和赋值操作。





5.结构体和类

仅当仅仅有数据时使用struct,其它一概使用class。

假设与STL结合,对于仿函数和特性能够不用class而是使用struct。

注意:类和结构体的成员变量使用不同的命名规则。

类的成员变量下面划线(_)结尾,结构体与普通变量一样。都是小写。

6.继承

使用组合通常比使用继承更适宜,假设使用继承的话,仅仅使用公共继承。

C++实践中,继承主要用于两种场合:实现继承。子类继承父类的实现代码;接口继承。子类仅继承父类的方法名称。

假设该类具有虚函数。其析构函数应该为虚函数。

限定仅在子类訪问的成员函数为protected,须要注意的是数据成员应始终为私有。





7.多重继承

真正须要用到多重实现继承的时候很少。仅仅有当最多一个基类中含有实现,其它基类都是以Interface为后缀的纯借口类时才会使用多重继承。

仅仅有当全部超类除第一个外都是纯接口时才干使用多重继承。为确保它们是纯接口。这些类必须以Interface为后缀。





8.接口

当一个类满足下面要求时,称之为纯接口:

1)仅仅有纯虚函数和静态函数(析构函数除外);

2)没有非静态数据成员;

3)未定义不论什么构造函数,假设有,也不含參数,而且为protected。

4)假设是子类,也仅仅能继承满足上述条件以Interface为后缀的类。





9.操作符重载

除少数特定环境外,不要重载操作符。

一般不要重载操作符,尤其是赋值操作(opeartor =)比較阴险,应避免重载。

假设须要的话,能够定义类似Equals(),CopyFrom()等函数。

10.存取控制

将数据成员私有化。并提供相关存取函数。

如定义变量foo_以及取值函数foo()、赋值函数set_foo()。





11.声明次序

在类中使用特定的声明次序:public在private之前,成员函数在数据成员前。

定义次序例如以下:public、protected、private。

每一块中,声明次序一般例如以下:

1)typedefs和enums;

2)常量;

3)构造函数。

4)析构函数。

5)成员函数。含静态成员函数;

6)数据成员,含静态数据成员。

宏DISALLOW_COPY_AND_ASSIGN至于private块之后。作为类的最后部分。





12.编写短小函数

倾向于选择短小、凝练的函数。

长函数有时是恰当的,因此对于函数长度并没有严格限制。

假设函数超过40行。能够考虑在不影响程序结构的情况下将其切割一下。

Google C++ style guide——C++类的更多相关文章

  1. Google C++ Style Guide在C++11普及后的变化

    转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...

  2. Google C++ Style Guide的哲学

    Google C++ Style Guide并不是一个百科全书,也不是一个C++使用指南,但它描述适用于Google及其开源项目的编码指南,并不追求全面和绝对正确,也有许多人置疑它的一些规则.但作为一 ...

  3. [Guide]Google C++ Style Guide

    0.0 扉页 项目主页 Google Style Guide Google 开源项目风格指南 -中文版 0.1 译者前言 Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. ...

  4. 一张图总结Google C++编程规范(Google C++ Style Guide)

    Google C++ Style Guide是一份不错的C++编码指南,我制作了一张比較全面的说明图,能够在短时间内高速掌握规范的重点内容.只是规范毕竟是人定的,记得活学活用.看图前别忘了阅读以下三条 ...

  5. Google Shell Style Guide

    转自:http://google.github.io/styleguide/shell.xml Shell Style Guide Revision 1.26 Paul Armstrong Too m ...

  6. Google JavaScript Style Guide

    转自:http://google.github.io/styleguide/javascriptguide.xml Google JavaScript Style Guide Revision 2.9 ...

  7. electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...

  8. Google coding Style Guide : Google 编码风格/代码风格 手册/指南

    1 1 1 https://github.com/google/styleguide Google 编码风格/代码风格 手册/指南 Style guides for Google-originated ...

  9. [Guide]Google Python Style Guide

    扉页 项目主页 Google Style Guide Google 开源项目风格指南 - 中文版 背景 Python 是Google主要的脚本语言.这本风格指南主要包含的是针对python的编程准则. ...

随机推荐

  1. C3P0连接池工具类实现步骤及方法

    C3P0连接池的工具类 使用C3P0获得连接对象连接池有一个规范接口 javax.sal.DataSourse 接口定义了一个从连接池中获得连接的方法getConnection(); 步骤导入jar包 ...

  2. docker 镜像管理操作

    镜像特点 1. 分层存储的文件 2.一个软件运行环境 3.一个镜像可以创建多个容器 4.一种标准交付 5.不包含Linux内核而又精简的Linux操作系统 6.不是一个单一的文件而是由多层构成的,可以 ...

  3. python基础一 day5 集合

    集合是无序的 增:add()添加进去是无序,不一定是最后面,update()像extend() 删: 没有改,有查,里面的元素是不可变类型 查用for in 交集: 并集: 反交集 叉集: 子集与超集 ...

  4. html自动刷新

    头部<meta http-equiv="refresh" content="10"> 或者js实现 <script language=&quo ...

  5. Educational Codeforces Round 59 (Rated for Div. 2) (前四题)

    A. Digits Sequence Dividing(英文速读) 练习英语速读的题,我还上来昏迷一次....只要长度大于2那么一定可以等于2那么前面大于后面就行其他no 大于2的时候分成前面1个剩下 ...

  6. python 容器 用户注册登录系统

    1. 列表和普通变量有什么区别 列表是数据类型,普通变量是用来存储数据的 可以把列表赋值给普通变量 2.存在列表 a = [11, 22, 33], 如何向列表中添加(增)新元素 44 a.appen ...

  7. 常用mysql

    搜索差价 select count(*) from gate_okex_cj; select * from (select count(*) as a_cj,coin from gate_okex_c ...

  8. 关于Python中包裹传参和解包裹的理解

    1.包裹传参 首先思考一个问题:为什么要有包裹传参?原因包括但不仅限于以下两点:①不确定参数的个数.②希望函数定义的更加松散灵活 包裹传参分两种:包裹位置传参和包裹关键字传参.先看包裹位置传参: 在这 ...

  9. 开门人和关门人(结构体+sort)

    每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签 到.签离记录,请根据记录找出当天开门和关门的人.    Input 测试输入的第一行给出记录的总天数N ( > ...

  10. Linux 命令大全 - 管理文件和目录的命令

    1.pwd 显示当前目录 该命令的英文解释为print working directory(打印工作目录).输入pwd命令,Linux会输出当前目录. 2.cd 命令用来改变所在目录 cd / 转到根 ...