Google C++编程风格指南(三)

Google C++编程风格指南.zip Google C++编程风格指南 立即下载

这一篇主要提到的是类,Lippman在《Inside The C++ Object Model 》第二章中对构造函数作了详尽说明,本文中提到的几个单词基本仿该书中译本侯捷先生的翻译:

explicit:明确的

implicit:隐含的

trivial:没有意义的

non-trivial:有意义的

 

原文地址:Google C++ Style Guide

  • 类

类是C++中基本的代码单元,自然被广泛使用。本节列举了在写一个类时要做什么、不要做什么。

1. 构造函数(Constructor)的职责

构造函数中只进行那些没有实际意义的(trivial,译者注:简单初始化对于程序执行没有实际的逻辑意义,因为成员变量的“有意义”的值大多不在构造函数中确定) 初始化,可能的话,使用Init()方法集中初始化为有意义的(non-trivial) 数据。

定义: 在构造函数中执行初始化操作。

优点: 排版方便,无需担心类是否初始化。

缺点: 在构造函数中执行操作引起的问题有:

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

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

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

4) 如果有人创建该类型的全局变量(虽然违背了上节提到的规则),构造函数将在main()之前被调用,有可能破坏构造函数中暗含的假设条件。例如,gflags尚未初始化。

结论: 如果对象需要有意义的(non-trivial) 初始化,考虑使用另外的Init()方法并(或)增加一个成员标记用于指示对象是否已经初始化成功。

2. 默认构造函数(Default Constructors)

如果一个类定义了若干成员变量又没有其他构造函数,需要定义一个默认构造函数,否则编译器将自动生产默认构造函数。

定义: 新建一个没有参数的对象时,默认构造函数被调用,当调用new[](为数组)时,默认构造函数总是被调用。

优点: 默认将结构体初始化为“不可能的”值,使调试更加容易。

缺点: 对代码编写者来说,这是多余的工作。

结论:

如果类中定义了成员变量,没有提供其他构造函数,你需要定义一个默认构造函数(没有参数)。默认构造函数更适合于初始化对象,使对象内部状态(internal state) 一致、有效。

提供默认构造函数的原因是:如果你没有提供其他构造函数,又没有定义默认构造函数,编译器将为你自动生成一个,编译器生成的构造函数并不会对对象进行初始化。

如果你定义的类继承现有类,而你又没有增加新的成员变量,则不需要为新类定义默认构造函数。

3. 明确的构造函数(Explicit Constructors)

对单参数构造函数使用C++关键字explicit。

定义: 通常,只有一个参数的构造函数可被用于转换(conversion,译者注:主要指隐式转换,下文可见) , 例如,定义了Foo::Foo(string name),当向需要传入一个Foo对象的函数传入一个字符串时,构造函数Foo::Foo(string name)被调用并将该字符串转换为一个Foo临时对象传给调用函数。看上去很方便,但如果你并不希望如此通过转换生成一个新对象的话,麻烦也随之而来。 为避免构造函数被调用造成隐式转换,可以将其声明为explicit。

优点: 避免不合时宜的变换。

缺点: 无。

结论:

所有单参数构造函数必须是明确的。在类定义中,将关键字explicit加到单参数构造函数前:explicit Foo(string name);

例外:在少数情况下,拷贝构造函数可以不声明为explicit;特意作为其他类的透明包装器的类。类似例外情况应在注释中明确说明。

4. 拷贝构造函数(Copy Constructors)

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

定义: 通过拷贝新建对象时可使用拷贝构造函数(特别是对象的传值时)。

优点: 拷贝构造函数使得拷贝对象更加容易,STL容器要求所有内容可拷贝、可赋值。

缺点: C++中对象的隐式拷贝是导致很多性能问题和bugs的根源。拷贝构造函数降低了代码可读性,相比按引用传递,跟踪按值传递的对象更加困难,对象修改的地方变得难以捉摸。

结论:

大量的类并不需要可拷贝,也不需要一个拷贝构造函数或赋值操作(assignment operator) 。不幸的是,如果你不主动声明它们,编译器会为你自动生成,而且是public的。

可以考虑在类的private中添加空的(dummy) 拷贝构造函数和赋值操作,只有声明,没有定义。由于这些空程序声明为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,如果类确实需要可拷贝,应在该类的头文件中说明原由,并适当定义拷贝构造函数和赋值操作,注意在operator=中检测自赋值(self-assignment) 情况。

在将类作为STL容器值得时候,你可能有使类可拷贝的冲动。类似情况下,真正该做的是使用指针指向STL容器中的对象,可以考虑使用std::tr1::shared_ptr。

5. 结构体和类(Structs vs. Classes)

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

在C++中,关键字struct和class几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。

struct 被用在仅包含数据的消极对象(passive objects)上,可能包括有关联的常量,但没有存取数据成员之外的函数功能,而存取功能通过直接访问实现而无需方法调用,这儿提到的方法是指只用于处 理数据成员的,如构造函数、析构函数、Initialize()、Reset()、Validate()。

如果需要更多的函数功能,class更适合,如果不确定的话,直接使用class。

如果与STL结合,对于仿函数(functors)和特性(traits) 可以不用class而是使用struct。

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

6. 继承(Inheritance )

使用组合(composition,译者注,这一点也是GoF在《Design Patterns》里反复强调的) 通常比使用继承更适宜,如果使用继承的话,只使用公共继承。

定义: 当子类继承基类时,子类包含了父基类所有数据及操作的定义。C++实践中,继承主要用于两种场合:实现继承(implementation inheritance) ,子类继承父类的实现代码;接口继承(interface inheritance) ,子类仅继承父类的方法名称。

优点: 实现继承通过原封不动的重用基类代码减少了代码量。由于继承是编译时声明(compile-time declaration) ,编码者和编译器都可以理解相应操作并发现错误。接口继承可用于程序上增强类的特定API的功能,在类没有定义API的必要实现时,编译器同样可以侦错。

缺点: 对于实现继承,由于实现子类的代码在父类和子类间延展,要理解其实现变得更加困难。子类不能重写父类的非虚函数,当然也就不能修改其实现。基类也可能定义了一些数据成员,还要区分基类的物理轮廓(physical layout) 。

结论:

所有继承必须是public的,如果想私有继承的话,应该采取包含基类实例作为成员的方式作为替代。

不要过多使用实现继承,组合通常更合适一些。努力做到只在“是一个”("is-a",译者注,其他"has-a"情况下请使用组合) 的情况下使用继承:如果Bar的确“是一种”Foo,才令Bar是Foo的子类。

必要的话,令析构函数为virtual,必要是指,如果该类具有虚函数,其析构函数应该为虚函数。

译者注:至于子类没有额外数据成员,甚至父类也没有任何数据成员的特殊情况下,析构函数的调用是否必要是语义争论,从编程设计规范的角度看,在含有虚函数的父类中,定义虚析构函数绝对必要。

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

当重定义派生的虚函数时,在派生类中明确声明其为virtual。根本原因:如果遗漏virtual,阅读者需要检索类的所有祖先以确定该函数是否为虚函数(译者注,虽然不影响其为虚函数的本质) 。

7. 多重继承(Multiple Inheritance )

真正需要用到多重实现继承(multiple implementation inheritance) 的时候非常少,只有当最多一个基类中含有实现,其他基类都是以Interface 为后缀的纯接口类时才会使用多重继承。

定义: 多重继承允许子类拥有多个基类,要将作为纯接口的基类和具有实现的基类区别开来。

优点: 相比单继承,多重实现继承可令你重用更多代码。

缺点: 真正需要用到多重实现继承的时候非常少,多重实现继承看上去是不错的解决方案,通常可以找到更加明确、清晰的、不同的解决方案。

结论: 只有当所有超类(superclass) 除第一个外都是纯接口时才能使用多重继承。为确保它们是纯接口,这些类必须以Interface 为后缀。

注意:关于此规则,Windows下有种例外情况(译者注,将在本译文最后一篇的规则例外中阐述)。

8. 接口(Interface )

接口是指满足特定条件的类,这些类以Interface为后缀(非必需)。

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

1) 只有纯虚函数("=0")和静态函数(下文提到的析构函数除外);

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

3) 没有定义任何构造函数。如果有,也不含参数,并且为protected;

4) 如果是子类,也只能继承满足上述条件并以Interface为后缀的类。

接口类不能被直接实例化,因为它声明了纯虚函数。为确保接口类的所有实现可被正确销毁,必须为之声明虚析构函数(作为第1条规则的例外,析构函数不能是纯虚函数)。具体细节可参考Stroustrup的《The C++ Programming Language, 3rd edition 》第12.4节。

优点: 以Interface为后缀可令他人知道不能为该接口类增加实现函数或非静态数据成员,这一点对于多重继承尤其重要。另外,对于Java程序员来说,接口的概念已经深入人心。

缺点: Interface后缀增加了类名长度,为阅读和理解带来不便,同时,接口特性作为实现细节不应暴露给客户。

结论: 。只有在满足上述需要时,类才以Interface结尾,但反过来,满足上述需要的类未必一定以Interface结尾。

9. 操作符重载(Operator Overloading )

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

定义: 一个类可以定义诸如+、/等操作符,使其可以像内建类型一样直接使用。

优点: 使代码看上去更加直观,就像内建类型(如int)那样,重载操作符使那些Equals()、Add()等黯淡无光的函数名好玩多了。为了使一些模板函数正确工作,你可能需要定义操作符。

缺点: 虽然操作符重载令代码更加直观,但也有一些不足

1) 混淆直觉,让你误以为一些耗时的操作像内建操作那样轻巧;

2) 查找重载操作符的调用处更加困难,查找Equals()显然比同等调用==容易的多;

3) 有的操作符可以对指针进行操作,容易导致bugs,Foo + 4做的是一件事,而&Foo + 4可能做的是完全不同的另一件事,对于二者,编译器都不会报错,使其很难调试;

4) 重载还有令你吃惊的副作用,比如,重载操作符&的类不能被前置声明。

结论:

一般不要重载操作符,尤其是赋值操作(operator=)比较阴险,应避免重载。如果需要的话,可以定义类似Equals()、CopyFrom()等函数。

然 而,极少数情况下需要重载操作符以便与模板或“标准”C++类衔接(如operator<<(ostream&, const T&)),如果被证明是正当的尚可接受,但你要尽可能避免这样做。尤其是不要仅仅为了在STL容器中作为key使用就重载operator==或 operator<,取而代之,你应该在声明容器的时候,创建相等判断和大小比较的仿函数类型。

有些STL算法确实需要重载operator==时可以这么做,不要忘了提供文档说明原因。

参考拷贝构造函数 和函数重载 。

10. 存取控制(Access Control )

将数据成员私有化,并提供相关存取函数,如定义变量foo_及取值函数foo()、赋值函数set_foo()。

存取函数的定义一般内联在头文件中。

参考继承 和函数命名 。

11. 声明次序(Declaration Order )

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

定义次序如下:public:、protected:、private:,如果那一块没有,直接忽略即可。

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

1) typedefs和enums;

2) 常量;

3) 构造函数;

4) 析构函数;

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

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

宏DISALLOW_COPY_AND_ASSIGN置于private:块之后,作为类的最后部分。参考拷贝构造函数 。

.cc文件中函数的定义应尽可能和声明次序一致。

不要将大型函数内联到类的定义中,通常,只有那些没有特别意义的或者性能要求高的,并且是比较短小的函数才被定义为内联函数。更多细节参考译文第一篇的 内联函数 。

12. 编写短小函数(Write Short Functions )

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

长函数有时是恰当的,因此对于函数长度并没有严格限制。如果函数超过40行,可以考虑在不影响程序结构的情况下将其分割一下。

即使一个长函数现在工作的非常好,一旦有人对其修改,有可能出现新的问题,甚至导致难以发现的bugs。使函数尽量短小、简单,便于他人阅读和修改代码。

在处理代码时,你可能会发现复杂的长函数,不要害怕修改现有代码:如果证实这些代码使用、调试困难,或者你需要使用其中的一小块,考虑将其分割为更加短小、易于管理的若干函数。

______________________________________

译者:关于类的注意事项,总结一下:

1. 不在构造函数中做太多逻辑相关的初始化;

2. 编译器提供的默认构造函数不会对变量进行初始化,如果定义了其他构造函数,编译器不再提供,需要编码者自行提供默认构造函数;

3. 为避免隐式转换,需将单参数构造函数声明为explicit;

4. 为避免拷贝构造函数、赋值操作的滥用和编译器自动生成,可目前声明其为private且无需实现;

5. 仅在作为数据集合时使用struct;

6. 组合>实现继承>接口继承>私有继承,子类重载的虚函数也要声明virtual关键字,虽然编译器允许不这样做;

7. 避免使用多重继承,使用时,除一个基类含有实现外,其他基类均为纯接口;

8. 接口类类名以Interface为后缀,除提供带实现的虚析构函数、静态成员函数外,其他均为纯虚函数,不定义非静态数据成员,不提供构造函数,提供的话,声明为protected;

9. 为降低复杂性,尽量不重载操作符,模板、标准类中使用时提供文档说明;

10. 存取函数一般内联在头文件中;

11. 声明次序:public->protected->private;

12. 函数体尽量短小、紧凑,功能单一。

IMU卡尔曼滤波方法详细介绍 本文介绍了基于IMU和卡尔曼滤波的状态估计方法。系统采用9维状态向量(位置、速度、加速度计零偏),通过牛顿运动学建立状态方程,并利用外部位置观测进行校正。详细推导了状态转移矩阵和控制输入矩阵的形式,阐述了预测和更新的计算步骤。同时说明了过程噪声Q和观测噪声R的设置原则,其中Q反映模型不确定性,R取决于传感器精度。该方法可有效融合IMU测量与外部观测数据,实现位置、速度和偏置的联合估计。 阅读详情

相关推荐

ZYNQ-7035+HMCAD1511高速数据采集系统设计

高速数据采集是电子测量、雷达信号处理与通信基带验证的核心技术基础,其性能瓶颈常集中于采样率、通道同步性与实时处理能力。基于ADC采样原理与SoC异构架构,高带宽、低抖动时钟链路与FPGA+ARM协同处理成为突破关键。ZYNQ-7035凭借275K逻辑单元与千级DSP资源,显著提升LVDS数据流吞吐与片上滤波/触发等实时算法部署能力;HMCAD1511则以1GSPS四通道同步采样和8位分辨率,满足示波器级动态范围需求。该组合广泛应用于嵌入式信号采集平台开发、教学实验系统构建及国产化仪器原型验证。

weixin_28939623的博客 262

Google 的 C++编程规范

Google 的C++编程规范及C++类型推导;

weixin_44835655的博客 2097

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2475

C++代码风格03

3. 类 类是 C++ 中代码的基本单元. 显然, 它们被广泛使用. 本节列举了在写一个类时的主要注意事项. 3.1. 构造函数的职责 Tip 构造函数中只进行那些没什么意义的 (trivial, 注: 简单初始化对于程序执行没有实际的逻辑意义, 因为成员变量 "有意义" 的值大多不在构造函数中确定) 初始化, 可能的话, 使用 Init() 方法集中初始化有意义的 (

667

Keil 丢失编译器版本5、内核文件core_cm3.c报错

若用的是旧版本的core_cm3.c ,就使用编译器v5编译工程;若想用编译器v6,就更新4个相关的内核文件:(CMSIS:Cortex Microcontroller Software Interface Standard,ARM Cortex™ 微控制器软件接口标准)

qq_52804040的博客 6244

AD创建属于自己的元件库(详细)

我今天开始学习AD2022,但是我想自己创建属于自己的元件库,但是奈何找了好多教程就是随便几句话就把我打发走了,弄了一天都没搞定(也许是我比较菜),所以现在乱懂了,自己写一个属于我们自己小白的教程,希望有用吧哈哈我比较偷懒,直接使用嘉立创上画好的元件导入,和我们自己创建自己画的步骤其实都一样。

qq_33591173的博客 2万+

代码规范

· 背景 Google的开源项目大多使用C++开发。每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。 本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。 风格,也被视为可读性,主要指称管理C++代码的习惯。使用

一介码农,热爱金融。 2941

利用Cesium引擎实现大疆智图B3DM三维模型的高效加载与可视化

本文详细介绍了如何利用Cesium引擎高效加载与可视化大疆智图B3DM三维模型。通过性能优化实战和典型应用场景分析,帮助开发者掌握模型预处理、渲染参数调优及高级功能实现技巧,提升大规模倾斜摄影数据的网页端展示效率。

weixin_29231725的博客 220

为什么尽量使用初始化而不要在构造函数里赋值

看这样一个模板,它生成的类使得一个名字和一个 T 类型的对象的指针关联起来。                                      template                                      class NamedPtr {

peter_chung的专栏 1149

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1179

【AI智能体】Dify 搭建数据分析应用实战操作详解

Dify 搭建数据分析应用实战详解

congge 7298

Google C++编程风格指南(三):C++ 类

关于类的注意事项,总结一下:1. 不在构造函数中做太多逻辑相关的初始化; 2.编译器提供的默认构造函数不会对变量进行初始化,如果定义了其他构造函数,编译器不再提供,需要编码者自行提供默认构造函数;3.为避免隐式转换,需将单参数构造函数声明为explicit;…… 类类是C++中基本的代码单元,自然被广泛使用。本节列举了在写一个类时要做什么、不要做什么。1. 构造函数

周睿的博客(blog) 910

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2646

[译]Google C++编程风格指南(三)

这一篇主要提到的是类,Lippman在《Inside The C++ Object Model》第二章中对构造函数作了详尽说明,本文中提到的几个单词基本仿该书中译本侯捷先生的翻译: explicit:明确的 implicit:隐含的 trivial:没有意义的 non-trivial:有意义的   原文地址:Google C++ Style Guide

ziyou飞翔的专栏 511

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Google C++编程风格指南(三):C++ 类(转载)

类<br />类是C++中基本的代码单元,自然被广泛使用。本节列举了在写一个类时要做什么、不要做什么。<br />1. 构造函数(Constructor)的职责<br />构造函数中只进行那些没有实际意义的(trivial,译者注:简单初始化对于程序执行没有实际的逻辑意义,因为成员变量的“有意义”的值大多不在构造函数中确定)初始化,可能的话,使用Init()方法集中初始化为有意义的(non-trivial)数据。<br />定义: 在构造函数中执行初始化操作。<br />优点: 排版方便,无需担心类是否

wulong710的专栏 728

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Google C++ 开源风格指南

Google 在 C++ 编程中的代码风格规范、命名约定、注释要求和格式规定,提升代码的可读性、可维护性和规范性。

有耐心做好简单事情,坚持写blog 4198

c++ google编程风格

简介 编码不易,每家公司都有它的脾气。 c++的编码风格也有不少流派,这里独选google,一是因为它牛逼,向牛逼的学习总没错,二是它有很多开源项目使用的就是这个风格。 当你不知道怎么做才好时,就先用google的吧,已经有无数前仁验证过了。 本文不是要再罗列一遍所有的细则,而是提炼出编码中随时需要使用的部分,作出总结,这样方便参考。 具体结节,还请稳步开源文档:C++ 风格指南。 头文件 使用 #define 保护,为保证唯一性,头文件的命名使用项目目录的全路径 避免使用前置声明,使用 #inclu

guotianqing的博客 1388

Google C++编程风格指南

  [译]Google C++编程风格指南(八)[完] 2008年09月03日 星期三 17:06 原文地址:Google C++ Style Guide 规则之例外前面说明的编码习惯基本是强制性的,但所有优秀的规则都允许例外。1. 现有不统一代码(Existing Non-conformant 阅读全文>> 类别:c

skyremember的专栏 1234

Google C++ 风格指南

背景介绍 风格指南的目标 C++ 版本 头文件 自包含头文件 #define 防护 包含所需内容 前置声明 在头文件中定义函数 头文件包含顺序与命名规范 作用域 命名空间 内部链接 非成员函数、静态成员函数与全局函数 局部变量 静态与全局变量 关于析构的决策 关于初始化的决策 常见模式 thread_local 变量 类 构造函数中的工作处理 隐式转换 可复制与可移动类型 优势 实现要点 注意事项 规范要求 结构体与类的选择 结构体 vs. 对组与元组 继承 运算符重载 访问控制 声明顺序 函数 输入与输出

AI工程化、开源分享、文档翻译、代码笔记 1445

Google C++ Style Guide - Google C++ 风格指南

Google C++ Style Guide - Google C++ 风格指南

程永强 2314

Google C++项目编程风格指南 (中文版) 分享

之前点击上方“AI算法与图像处理”,选择加"星标"或“置顶”重磅干货,第一时间送达导读这是一份来自Google开源的文档c++部分总共有 67 页,本文分享的内容,是基...

zero的博客 1575

Google C++ Style Guide 谷歌 C++编码风格指南,深入理解华为与谷歌的编程规范——C和C++实践指南

来看,return;(比如刷新 log),您可以把它绑定到 _at_quick_exit(). 如果您想在 exit() 和 quick_exit() 都用上该 handler, 都。Tip: 使用 C++ 的类型转换, 如 static_cast<>(). 不要使用 int y = (int)x 或 int y = int(x) 等转换方式;TextQuery::TextQuery(std::string word) : word_(word) {} , 其中 word_ 自然是类内私有成员。

C++,Java,Python,C#编程选手,偶尔刷刷leetcode 1388

Google C++编程风格指南 - 中文版

背景¶ C++ 是 Google 大部分开源项目的主要编程语言. 正如每个 C++ 程序员都知道的, C++ 有很多强大的特性, 但这种强大不可避免的导致它走向复杂,使代码更容易产生 bug, 难以阅读和维护. 本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码易于管理的同时, 高效使用 C++ 的语言特性. 风格, 亦被称作可读性, 也就是指导 C++ 编程的约定. 使用术语 “风格” 有些用词不当, 因为这些习惯远不止源代码文件格式化这么简单. 使代码易于管理的方法之一是加

qq_38199336的博客 1621

C++ Google代码风格

C++ Google代码风格0 index(扉页)0.0 声明0.1 译者前言0.2 背景headers(头文件)1.1 Self-contained 头文件1.2. #define 保护1.3. 前置声明1.4. 内联函数1.5. #include 的路径及顺序译者(acgtyrant)笔记scoping(作用域)2. 作用域2.1. 命名空间2.2. 匿名命名空间和静态变量2.3. 非成员函数...

baidu_28926495的博客 1623

Google C++编程风格指南(一):头文件

 本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。本指南的另一个观点是C++特性的臃肿。C++是一门包含大量高级特性的巨型语言,某些情况下,我们会限制甚至禁止使用某些特性使代码简化,避免可能导致的各种问题 系列文章目录:Google C++编程风格指南(一):头文件        【本文】Google C++编程风格指南(二):作用域Google

周睿的博客(blog) 1624
上一篇: Google C++编程风格指南(二)
下一篇: Google C++编程风格指南(四)
olncy
博客等级 码龄20年 30粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值