首页 > 编程 > C++ > 正文

续C++ style 笔记

2019-11-11 00:30:35
字体:
来源:转载
供稿:网友

5.19 auto

vector<string> v;auto s1=v[0]; // 创建一份v[0]const auto& s2=v[0];

优点: C++类型名有时很长的, spare_hash_map<string,int>::iterator iter= m.find(val); 返回类型是不是很难读啊 不过代码是可以重构成 auto iter = m.find(val);

auto 只能用在局部变量里,其他地方别用。 auto 和C++11 特性[尾置返回类型 trailing return type] 一起用, 不过后者只能用在lambda表达式里。

5.20 列表初始化

5.21. Lambda 表达式 适当的使用,显示使用Lambda捕获,不要使用默认的。 Lambda表达式是创建匿名函数对象的一种简易途径,常用于把函数当 做参数传递。

std::sort(v.begin(),v.end(),[](int x,int y){ return Weight(x)<Weight(y);});

(polymorhpic wrapper) std::function

优点: 传函数对象给STL算法,Lambdas 非常方便

缺点: Lambdas 的变量捕获旁门左道,可能造成悬空指针 层层的嵌套的Lambda的匿名函数难以阅读。

显示捕获 [n](int x) {return x+n;} 这样读者更加容易知道n是捕获值

5.22 模板编程 不要使用复杂的模板编程。

利用C++模板实例化机制是图灵完备性。可以用来实现编译时刻 的类型判断的一系列的技巧。

优点: 模板编程能够实现非常灵活的类型安全的接口和极好的性能。

5.23 Boost 库 只使用Boost库中被认可的库

什么是Boost库? Boost库是一个广受欢迎的,经过同行鉴定的免费开源的C++库

6.命名约定

6.1. 通用命名规则

6.3. 类型命名 所有类型命名 —— 类, 结构体, 类型定义 类型名称的每个单词首字母均大写, 不包含下划线

全局变量:可以用 g_ 或其它标志作为前缀, 以便更好的区分局部变量.

6.5. 常量命名 const int kDaysInAWeek = 7; 6.6. 函数命名 … 7. 注释 7.2. 文件注释 在每一个文件开头加入版权公告, 然后是文件内容描述. 1.版权声明 (比如, Copyright 2008 Google Inc.) 2.许可证. 为项目选择合适的许可证版本 (比如, Apache 2.0, BSD, LGPL, GPL) 3.作者: 标识文件的原始作者.

7.3. 类注释

每个类的定义都要附带一份注释, 描述类的功能和用法.

// Iterates over the contens of a GargantuanTable. sample usage// GargantuanTable_Iteratar * iter = table->NewIterator()// for(iter->Seek("foo");!iter->done();iter->Next()){// PRocess(iter->key(),iter->value());//}// delete iter;class GargantuanTable_Iteratar{ ...};

7.4. 函数注释

函数的输入输出. 对类成员函数而言: 函数调用期间对象是否需要保持引用参数, 是否会释放这些参数. 如果函数分配了空间, 需要由调用者释放. 参数是否可以为 NULL. 是否存在函数使用上的性能隐患. 如果函数是可重入的, 其同步前提是什么?

// Returns an iterator for this table. It is the client's// responsibility to delete the iterator when it is done with it,// and it must not use the iterator once the GargantuanTable object// on which the iterator was created has been deleted.//// The iterator is initially positioned at the beginning of the table.//// This method is equivalent to:// Iterator* iter = table->NewIterator();// iter->Seek("");// return iter;// If you are going to immediately seek to another place in the// returned iterator, it will be faster to use NewIterator()// and avoid the extra seek.Iterator* GetIterator() const;

注明构造函数对参数做了什么 (例如, 是否取得指针所有权) 以及析构函数清理了什么.

7.5. 变量注释

7.6 实现注释

注意 永远不要 用自然语言翻译代码作为注释. 要假设读代码的人 C++ 水平比你高, 即便他/她可能不知道你的用意:

7.7. 标点, 拼写和语法

7.8. TODO 注释 对那些临时的, 短期的解决方案, 或已经够好但仍不完美的代码使用 TODO 注释

7.9. 弃用注释 通过弃用注释(DEPRECATED comments)以标记某接口点(interface points)已弃用

8.格式 8.4. 函数声明与定义

8.5. Lambda 表达式

其它函数怎么格式化形参和函数体,Lambda 表达式就怎么格式化;捕获列表同理。

若用引用捕获,在变量名和 & 之间不留空格。 8.10. 指针和引用表达式 句点或箭头前后不要有空格. 指针/地址操作符 (*, &) 之后不能有空格.

8.13. 变量及数组初始化

用 =, () 和 {} 均可.

8.15. 类格式 访问控制块的声明依次序是 public:, protected:, private:, 每次缩进 1 个空格.

8.17. 名字空间格式化 名字空间 不要增加额外的缩进层次

8.18. 水平留白

9.规则特例


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选