Google C++风格指南 阅读笔记

2023-11-13

这个Google C++风格指南出得太好了,有很多C++的问题,其实通过阅读这份文档就可以了。相信读完后,可以在简历上加上一句,“具有良好的编码风格”,哈哈。下面记录一下我的读书笔记吧。整份文档的中文版本我已经上传到了资源里面。

1. 头文件

1.1头文件保护

每次Eclipse CDT新建一个Class的时候,都是做了define保护:
所有头文件都应该使用 #define 防止头文件被多重包含, 命名格式当是:
<PROJECT>_<PATH>_<FILE>_H_

1.2头文件依赖

能用前置声明的地方尽量不使用 #include.
当一个头文件被包含的同时也引入了新的依赖, 一旦该头文件被修改, 代码就会被重新编译.

如果这个头文件又包含了其他头文件, 这些头文件的任何改变都将导致所有包含了该头文件的

代码被重新编译. 因此, 我们倾向于减少包含头文件, 尤其是在头文件中包含头文件。
使用前置声明可以显著减少需要包含的头文件数量. 举例说明: 如果头文件中用到类 File,

但不需要访问 File 类的声明, 头文件中只需前置声明 class File; 而无须 #include

"file/base/file.h".
不允许访问类的定义的前提下, 我们在一个头文件中能对类 Foo 做哪些操作?
?    我们可以将数据成员类型声明为 Foo * 或 Foo &.
?    我们可以将函数参数 / 返回值的类型声明为 Foo (但不能定义实现).
?    我们可以将静态数据成员的类型声明为 Foo, 因为静态数据成员的定义在类定义之外

.
反之, 如果你的类是 Foo 的子类, 或者含有类型为 Foo 的非静态数据成员, 则必须包含 Foo

所在的头文件.

1.3.    内联函数

一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往

比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!

2.作用域

2.5. 静态和全局变量

    禁止使用 class 类型的静态或全局变量: 它们会导致很难发现的 bug 和不确定的构

造和析构函数调用顺序. 静态生存周期的对象, 包括全局变量, 静态变量, 静态类成员变量,

以及函数静态变量, 都必须是原生数据类型 (POD : Plain Old Data)。

3类

3.4. 拷贝构造函数

缺点:
C++ 中的隐式对象拷贝是很多性能问题和 bug 的根源. 拷贝构造函数降低了代码可读性, 相

比传引用, 跟踪传值的对象更加困难, 对象修改的地方变得难以捉摸.
可以考虑在类的 private: 中添加拷贝构造函数和赋值操作的空实现, 只有声明, 没有定义.

由于这些空函数声明为 private, 当其他代码试图使用它们的时候, 编译器将报错. 方便起见

, 我们可以使用 DISALLOW_COPY_AND_ASSIGN 宏:
#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);
};
如果类确实需要可拷贝, 应在该类的头文件中说明原由, 并合理的定义拷贝构造函数和赋值操

作。

5.其它C++特性

5.7. 运行时类型识别

优点:
RTTI 在某些单元测试中非常有用. 比如进行工厂类测试时, 用来验证一个新建对象是否为期

望的动态类型.
除测试外, 极少用到.
缺点:
在运行时判断类型通常意味着设计问题. 如果你需要在运行期间确定一个对象的类型, 这通常

说明你需要考虑重新设计你的类.

5.10. 前置自增和自减

优点:
不考虑返回值的话, 前置自增 (++i) 通常要比后置自增 (i++) 效率更高. 因为后置自增 (或

自减) 需要对表达式的值 i 进行一次拷贝. 如果 i 是迭代器或其他非数值类型, 拷贝的代价

是比较大的. 既然两种自增方式实现的功能一样, 为什么不总是使用前置自增呢?
结论:
对简单数值 (非对象), 两种都无所谓. 对迭代器和模板类型, 使用前置自增 (自减).



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google C++风格指南 阅读笔记 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • nodejs剪切视频,提取音频,上传播放

    简单说说实现方案 首先要有演唱会的链接 使用ibili 这个库下载视频 也可以自己抓取视频链接请求下载 这里有很多方法 将视频保存在本地后 整理出每一首歌曲对应的时分秒 我找的这个视频在某站评论中已经有人整理过了 所以我用 ibili 这个
  • netty在xxl-job中的使用分析

    xxl job版本 2 3 0 netty版本 netty all 4 1 63 final 一 基于spring容器 客户端启动流程 客户端如springboot应用引入xxl core的jar包后 启动springboot过程中会调用x
  • Mysql8.0 安装手册(linux)

    目录 添加Mysql的 yum 仓库 安装mysql 开启远程访问 添加Mysql的 yum 仓库 访问 https dev mysql com downloads repo yum 下载 yum 源 点击 download 复制下载链接使
  • 00.JavaScript基础

    0o 参考资料 js https codeofli github io 2019 11 js note javaScript javaScript vue https codeofli github io 2019 11 js note v
  • @ConfigurationProperties灵活的映射配置信息

    介绍 在用 ConfigurationProperties最常用的功能是用此注解对类进行修饰 设置好prefix前缀 这样在springboot的配置文件中 配置信息的key和value就会对应的配置到类中的属性上 以设置eureka信息为
  • nas挂载windows_【群晖系统】群晖下直接挂载WINDOWS的NTFS格式硬盘

    群晖的硬盘格式是EXT4 相对于WINDOWS下的NTFS格式 大家较不熟悉 在数据管理 使用 恢复等都不如NTFS方便 如果群晖能支持NTFS格式就好了 相信每一位装黑群晖的朋友当时都会有这样的想法 其实 群晖是支持外部设备的NTFS格式
  • c++实现引用计数

    概述 当有指针指向同一块内存空间时 计数器加1 没增加一个指向该内存空间的指针 计数器加1 同理 当原本指向该内存空间的指针指向另一块内存 计数器减1 被指向的另一个内存的计数器加1 下面是一个引用计数的一种实现 示例 直接上代码 总共分为
  • uni-app项目中如何使用scss less

    前言 由于公司业务调整 特意学习下uni项目框架 其实根据官方api就是实现很多功能 其实都是一些小坑要走 下面来说一下uni项目中如何使用scss vue编写中我们可以直接使用下面这样方法 多方便
  • Eclispse中Run on Server窗口让选择Server,但已经存在的选择不了

    对于这种问题 通常是因为版本不匹配造成的 jdk版本 Dynamic Web Modules版本 只要改到相应版本就好了 jdk7 时Dynamic Web Modules应设为2 5 如果无法修改 可以新建一个工程 在新建工程时选择Dyn
  • 记忆深处有尘埃——Memory Compiler

    Memory是大家Floorplan中经常使用到一个器件 而且需要花费不少时间去摆放它 Memory的种类很多 各种类型还分别具有不同的参数 那大家有没有想过 对一个设计来说 我们是如何去选择合适的memory类型 不同的类型有什么区别 在
  • 作为一名程序员,如何开展自己的副业?月赚三万的真实故事

    作为一名程序员 除了敲代码之外还应该有一些副业 我们都是程序员 大多数都是普通人 都在替别人打工 虽然收入在别人眼中挺高 但是连个首付都付不起 这时 首先得要发展副业 与其拿着死工资 还不如做些啥 今天 我所说的不是教大家如何去挣很多钱 而
  • mavon-editor 页面回显使用turndown将HTML转为markdown

    1 安装npm install turndown npm install turndown 2页面使用 v model markdowntext
  • 后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案

    前言 性能优化 是前端绕过不去的一道门槛 甚是重要 最近一年 也很少有机会在项目中进行前端性能优化 一直在忙于业务开发 最近终于是来了机会 遇到了这样的场景 心里也甚是激动 写个随笔记录下性能优化的过程及逻辑 有需要的可以参考下 场景 后端
  • 机器学习实战笔记8(kmeans)

    前面的7次笔记介绍的都是分类问题 本次开始介绍聚类问题 分类和聚类的区别在于前者属于监督学习算法 已知样本的标签 后者属于无监督的学习 不知道样本的标签 下面我们来讲解最常用的kmeans算法 1 kmeans算法 算法过程 Kmeans中
  • Spring核心思想 IOC 、 AOP

    Spring核心思想 IOC AOP IOC 1 什么是IOC 2 IOC解决了什么问题 IoC解决对象之间的耦合问题 3 IOC和DI的区别 AOP 1 什么是AOP 2 AOP在解决什么问题 3 为什么叫切面编程 内容就不展示了 里面已
  • Python自动检查哪位学生未提交作业

    最近期未需要对学生提交的作业进行统计 给平时成绩 总共交了8次作业 每个作业都有2个班 数量太多 于是就利用Python写了一个程序来自动实现 思想 获取指定路径下的所有文件名 如果文件名中包含了学生的名字 因为提交作业的时候以学号 名字进
  • 基于TMF SID的高可扩展性数据模型

    基于TMF SID的高可扩展性数据模型 前言 此文根据TMF SID规范撰写 欢迎大家提出建议和意见 TMF文档版权信息 Copyright TeleManagement Forum 2013 All Rights Reserved Thi
  • Flutter Windows应用开发环境配置

    为什么要入Flutter开发的坑 首先在当今Windows开发已经逐渐成为一个偏小众的领域 不仅要涉及的知识面广 还对开发人员的要求不低 界面的精美也成为一个重要因素 目前已知的Windows 客户端主要分成以下几种 开发语言 Qt C C
  • Android登录 之 Twitter登录

    作为Android登录 之 GooglePlay登录的姊妹篇 这俩篇主要是对接国外平台登录的文章 作者文笔并不好 但是 管他呢 实现功能不就得了嘛 Twitter官网 兄弟们自带梯子啊 然后按照流程 创建申请什么的 也就不多说了 接下来就是
  • Google C++风格指南 阅读笔记

    这个Google C 风格指南出得太好了 有很多C 的问题 其实通过阅读这份文档就可以了 相信读完后 可以在简历上加上一句 具有良好的编码风格 哈哈 下面记录一下我的读书笔记吧 整份文档的中文版本我已经上传到了资源里面 1 头文件 1 1头