Google C++ styleguide Guide 中为什么禁止使用缺省函数参数

怎么规范函数、变量等的命名 - C++当前位置:& &&&怎么规范函数、变量等的命名怎么规范函数、变量等的命名&&网友分享于:&&浏览:7次如何规范函数、变量等的命名例如命名一个获取函数参数的类型和名称的函数:GetTypeAndNameOfFuncArg这个名字还好,算比较短的,有时候会遇到一些名字很长的,很是懊恼,不知怎么命名,大家分享下平时命名的习惯吧!------解决方案--------------------你这个名字很长了,可能在Java中会比较常见,但是在C++中,太长了都会使用缩写了
------解决方案--------------------1.根据代码总长度和作用域范围定长度,如果该函数只在某个源码文件内有效且文件长度有限,名字不妨短一些,必要时加注释2.根据功能划分定长度,这个功能按问题域术语、分析域术语、实现域术语划分----LZ的例子应该是属于实现域的,涉及语言自身的特征和具体的实现技术,这样代码只有专业程序员看,不妨长一些(问题域是原始题目中的术语--往往比较直接简朴--短一点、分析域是问题归结到范围--如数据结构那样的范畴,往往概念比较清楚、大家交流容易--短一点)3.看看函数的参数能否有帮助?如果调用函数的参数命名很清楚,那么函数的主要体现动词谓语概念,而参数主要体现名词宾语或状语概念。如最简单的swap(X,Y),不必写成swapTwoObject().个人体会,供参考
------解决方案--------------------仔细看看了LZ的例子,名字不妨改为“获取(函数)参数的属性”----》GetArbitOfArg(Arg已经有了函数的概念,而类型和名字不必那么直接给出----在函数调用的上下文中可能读出)
------解决方案--------------------可以看一下google的C++ style标准http://google-/svn/trunk/cppguide.xml
------解决方案--------------------命名规则一般根据自个公司或者自个开发组的规范要求统一与可读。有时候简写会损害可读性。
------解决方案--------------------去看下google或者华为的c++编程规范,会找到你想要的内容。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有&|&&|&&|&&|&&
当前位置: >
google c++ 编码规范
作者:xiexievv & 来源:转载 &
摘要: 前言googleC++编程规范相当丰富,本文只截取了命名约定内容头文件作用域类google 的奇技淫巧其他c++特效命名约定注释格式规则特列google编程规范英文网站:/google/styleguidehttp://google.github.io/styleguide/cppguide.htmlgoogle编程规范中文网站: http://zh-googl
google C++编程规范相当丰富,本文只截取了命名约定内容
google&的奇技淫巧
其他c++特效
google编程规范英文网站:
/google/styleguide
http://google.github.io/styleguide/cppguide.html
google编程规范中文网站:
&http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/
为什么推荐 google c++编程规范
推荐这边文章:《匈牙利命名法的辩思》&http://blog.csdn.net/fullsail/article/details/8039253
Google代码规范工具Cpplint的使用:
http://blog.csdn.net/fengbingchun/article/details/
1. 命名约定
最重要的一致性规则是命名管理. 命名风格快速获知名字代表是什么东东: 类型? 变量? 函数? 常量? 宏 ... ? 甚至不需要去查找类型声明. 我们大脑中的模式匹配引擎可以非常可靠的处理这些命名规则.
命名规则具有一定随意性, 但相比按个人喜好命名, 一致性更重, 所以不管你怎么想, 规则总归是规则.
1.1. 通用命名规则
函数命名,变量命名,文件命名要有描述性;少用缩写。
尽可能给有描述性的命名,别心疼空间,毕竟让代码易于新读者理解很重要。不要用只有项目开发者能理解的缩写,也不要通过砍掉几个字母来缩写单词。
int price_count_reader;
int num_errors;
// “num” 本来就很常见
int num_dns_connections;
// 人人都知道 “DNS” 是啥
// 莫名其妙。
// 怪缩写。
int n_comp_conns;
// 怪缩写。
int wgc_connections;
// 只有贵团队知道是啥意思。
int pc_reader;
// "pc" 有太多可能的解释了。
int cstmr_id;
// 有删减若干字母。
1.2. 文件命名
文件名要全部小写, 可以包含下划线 (_) 或连字符 (-). 按项目约定来. 如果并没有项目约定,”_” 更好。
可接受的文件命名:
* my_useful_class.cc
* my-useful-class.cc
* myusefulclass.cc
* muusefulclass_test.cc // ``_unittest`` 和 ``_regtest`` 已弃用。
C++ 文件要以&.cc&结尾, 头文件以&.h&结尾. 专门插入文本的文件则以&.inc&结尾,参见:ref:self-contained headers。
不要使用已经存在于&/usr/include&下的文件名 (Yang.Y 注: 即编译器搜索系统头文件的路径), 如db.h.
通常应尽量让文件名更加明确.&http_server_logs.h&就比&logs.h&要好. 定义类时文件名一般成对出现, 如&foo_bar.h&和&foo_bar.cc, 对应于类&FooBar.
内联函数必须放在&.h&文件中. 如果内联函数比较短, 就直接放在&.h&中.
1.3. 类型命名
类型名称的每个单词首字母均大写, 不包含下划线:&MyExcitingClass,&MyExcitingEnum.
所有类型命名 —— 类, 结构体, 类型定义 (typedef), 枚举 —— 均使用相同约定. 例如:
// classes and structs
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...
// typedefs
typedef hash_map&UrlTableProperties *, string& PropertiesMap;
enum UrlTableErrors { ...
1.4. 变量命名
变量名一律小写, 单词之间用下划线连接. 类的成员变量以下划线结尾, 但结构体的就不用,如::a_local_variable,&a_struct_data_member,&a_class_data_member_.
普通变量命名:
string table_
// 可 - 用下划线。
// 可 - 全小写。
string tableName;
// 差 - 混合大小写。
类数据成员:
不管是静态的还是非静态的,类数据成员都可以和普通变量一样, 但要接下划线。
class TableInfo {
string table_name_;
// 可 - 尾后加下划线。
string tablename_;
static Pool&TableInfo&* pool_;
结构体变量:
不管是静态的还是非静态的,结构体数据成员都可以和普通变量一样, 不用像类那样接下划线:
struct UrlTableProperties {
string name;
int num_entries;
结构体与类的讨论参考&结构体 vs. 类&一节.
对全局变量没有特别要求, 少用就好, 但如果你要用, 可以用&
g_&或其它标志作为前缀, 以便更好的区分局部变量.
1.5. 常量命名
在全局或类里的常量名称前加&k: kDaysInAWeek. 且除去开头的&k&之外每个单词开头字母均大写。
所有编译时常量, 无论是局部的, 全局的还是类中的, 和其他变量稍微区别一下.&k&后接大写字母开头的单词:
const int kDaysInAWeek = 7;
这规则适用于编译时的局部作用域常量,不过要按变量规则来命名也可以。
1.6. 函数命名
常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配:&MyExcitingFunction(),MyExcitingMethod(),&my_exciting_member_variable(),&set_my_exciting_member_variable().
函数名的每个单词首字母大写, 没有下划线。
如果您的某函数出错时就要直接 crash, 那么就在函数名加上 OrDie. 但这函数本身必须集成在产品代码里,且平时也可能会出错。
AddTableEntry()
DeleteUrl()
OpenFileOrDie()
取值和设值函数:
取值(Accessors)和设值(Mutators)函数要与存取的变量名匹配. 这儿摘录一个类,num_entries_&是该类的实例变量:
class MyClass {
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
int num_entries_;
其它非常短小的内联函数名也可以用小写字母, 例如. 如果你在循环中调用这样的函数甚至都不用缓存其返回值, 小写命名就可以接受.
1.7. 名字空间命名
名字空间用小写字母命名, 并基于项目名称和目录结构:&google_awesome_project.
关于名字空间的讨论和如何命名, 参考&名字空间&一节.
1.8. 枚举命名
枚举的命名应当和&常量&或&宏&一致:&kEnumName&或是&ENUM_NAME.
单独的枚举值应该优先采用& 常量&的命名方式. 但& 宏&方式的命名也可以接受. 枚举名&
UrlTableErrors(以及&
AlternateUrlTableErrors) 是类型, 所以要用大小写混合的方式.
enum UrlTableErrors {
kErrorOutOfMemory,
kErrorMalformedInput,
enum AlternateUrlTableErrors {
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
2009 年 1 月之前, 我们一直建议采用&宏&的方式命名枚举值. 由于枚举值和宏之间的命名冲突, 直接导致了很多问题. 由此, 这里改为优先选择常量风格的命名方式. 新代码应该尽可能优先使用常量风格. 但是老代码没必要切换到常量风格, 除非宏风格确实会产生编译期问题.
1.9. 宏命名
你并不打算:ref:使用宏 &preprocessor-macros&, 对吧? 如果你一定要用, 像这样命名:MY_MACRO_THAT_SCARES_SMALL_CHILDREN.
参考:ref:预处理宏 &preprocessor-macros&; 通常&不应该&使用宏. 如果不得不用, 其命名像枚举命名一样全部大写, 使用下划线:
#define ROUND(x) ...
#define PI_ROUNDED 3.0
1.10. 命名规则的特例
如果你命名的实体与已有 C/C++ 实体相似, 可参考现有命名策略.
bigopen():
函数名, 参照&
open()&的形式
struct&或&
class, 参照&
pos&的形式
sparse_hash_map:
STL 相似实体; 参照 STL 命名约定
LONGLONG_MAX:
常量, 如同&
译者(acgtyrant)笔记
感觉 Google 的命名约定很高明,比如写了简单的类 QueryResult, 接着又可以直接定义一个变量 query_result, 区分度很好;再次,类内变量以下划线结尾,那么就可以直接传入同名的形参,比如 TextQuery::TextQuery(std::string word) : word_(word) {}, 其中&word_&自然是类内私有成员。
版权所有 IT知识库 CopyRight (C)
, All Rights Reserved.C++编码规范(Google C++ Style Guide)
第2页_Linux编程_Linux公社-Linux系统门户网站
你好,游客
C++编码规范(Google C++ Style Guide)
来源:Linux社区&
作者:Linux
IV Classes
1.构造函数
不要在构造函数中进行复杂的初始化操作,特别是那些可能失败的操作和调用虚函数的操作。
如果不使用异常(不推荐使用异常)构造函数无法表述一个错误。如果在构造函数中执行初始化失败,那么我们将得到一个处于未知状态的对象。
如果在构造函数中调用了虚函数,那么对虚函数的调用不会传递到子类,这可能会引人迷惑。
如果有人定义了一个这个类类型的全局变量(这是违反规范的,但有人仍然会这样做),那么构造函数将在main()函数之前被调用,这时构造函数中某些隐式的依赖可能并不成立。
2.默认构造函数
当你new一个对象并且不传入任何参数时,默认构造函数将被调用。new[]总是调用默认构造函数。
如果一个类定义了成员变量,则应该总是定义默认构造函数。因为编译器生成的默认构造函数也许并不能正确(或是以你所期望的方式)初始化对象。
3.Explicit构造函数
只有一个参数的构造函数,应该使用explicit关键字声明。如果不使用explicit关键字,那么这个构造函数将可以被用作隐式类型转换,这可能并不是我们所希望的。如果构造函数确实要用于隐式类型转换,则需要在注释中明确说明。
拷贝构造函数不需要使用explicit关键字声明。
4.拷贝构造函数
只在必要的时候才定义拷贝构造函数和赋值操作符。在其他情况下,使用宏DISALLOW_COPY_AND_ASSIGN来禁止编译器生成它们。
拷贝构造函数通常拥有比CopyFrom()之类的拷贝函数更好的性能,因为它将对象的构建和拷贝结合在一起。
只有极少的情况下对象才需要被拷贝,比如STL容器要求对象是可拷贝和赋值的,但是大多数情况下在STL中存储对象的指针同样可以达到目的并且可以提供更好的性能。
如果你的类需要拷贝,提供一个拷贝方法如CopyFrom()或Clone(),因为这些方法需要被显式调用从而避免由拷贝构造函数带来的隐藏的可能Bug。如果定义一个拷贝方法不能满足需求(比如出于性能原因或者需要存放在STL容器中),那么定义拷贝构造函数和赋值操作符。
如果不需要拷贝构造函数和赋值操作符,那么在private区段声明它们并且不提供定义,这样以任何方式使用它们都将导致链接错误。
DISALLOW_COPY_AND_ASSIGN宏定义如下:
// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
TypeName& operator=(const TypeName&)
然后如下使用:
class Foo {
Foo(int f);
DISALLOW_COPY_AND_ASSIGN(Foo);
5.结构体和类
结构体和类在C++中几乎完全一样。不同之处在于结构体的成员默认是公有的,而类的成员默认是私有的。
结构体应该仅用于承载数据,并且只具有构造函数、析构函数及其它一些简单操作数据成员的方法。
结构体的成员变量命名方法与类的成员变量命名方式不同。
继承分为实现继承和接口继承(类似Java的继承和接口实现),实现继承将实实在在地继承基类中的代码,而接口继承只继承基类中的方法声明。
通常情况下组合比继承更好。如果要使用继承,应该使用public继承。如果你认为有必要使用private继承,请优先考虑包含基类的一个实例。
将析构函数声明为virtual。如果你的类有虚函数,那么它的析构函数应该声明为virtual。
如果要子类中重写基类的virtual方法,那么在方法声明中明确使用virtual声明它是一个虚方法。
将多继承的使用限定在只有一个基类具有实现,其它基类都是pure interfaces的情况(与Java的继承和接口实现机制相似)。
一个类如果满足以下条件则称为pure interface:
只有public的virtual (" = 0 ")方法和静态方法。
没有非静态数据成员。
不需要任何构造函数。
一个接口类的析构函数应该声明为virtual。
9.操作符重载
通常情况下,不要重载操作符。
为了让某些模板正确工作,你可能需要定义相应的操作符。
为了和STL协同工作,你可能需要定义operator==和operator&,但是请优先考虑创建equality and comparison functor types。
10.访问控制
数据成员应声明为private,如有需要可以提供相应的accessor和mutator方法。
通常一个数据成员应命名为foo_,accessor命名为foo(),mutator命名为set_foo()。
static const数据成员(通常命名为kFoo)不需要声明为private。
accessor和mutator通常在头文件中定义为inline函数。
11.声明顺序
类应按如下顺序进行声明:public区段、protected区段、private区段。
在每一个区段内部,应按如下顺序进行声明:
Typedefs and Enums
Constants (static const data members)
Constructors
Destructor
Methods, including static methods
Data Members (except static const data members)
Friend declarations应该在private区段声明,并且DISALLOW_COPY_AND_ASSIGN 宏应该在private区段的最后。
cc文件中方法的定义顺序应与头文件中方法声明的顺序一致。
12.编写简短的函数
对于函数的长度并没有硬限制,不过通常情况下,当函数超过40行应该考虑是否应该在不破坏程序结构的情况下将它进行拆分。
V Google-Specific Magic
1.智能指针
智能指针在防止内存泄漏和编写exception-safe的代码方面非常有用。
使用scoped_ptr,不要使用auto_ptr,因为auto_ptr的所有权转移语义令人迷惑。
谨慎地使用shared_ptr。
Google使用cpplint.py脚本来检测style errors。
VI Other C++ Features
1.引用参数
只传递const引用作为参数。
2.函数重载
谨慎使用函数重载,因为重载的多个版本可能让人迷惑。
3.默认参数
不使用默认参数,除非是在.cc文件中的static函数或者是unnamed namespace中的函数,因为它们的使用范围很小。
可以使用默认参数模拟变长参数列表。
4.变长数组和alloca()
不使用变长数组和alloca()。
alloca()在栈上分配空间,在调用alloca()的函数返回时空间将被自动释放,因此不能用free()来释放。
使用scoped_ptr和scoped_array来代替。
谨慎使用友元,通常用于构建工厂模式。
不使用C++异常。
7.运行时类型信息RTTI
不使用RTTI。
通过typeid或者dynamic_cast可以得到C++对象的类型信息。如果需要使用RTTI,那么通常情况下说明你的设计存在问题。
不要使用C风格的类型转换。
不要使用流。
10.Preincrement and Predecrement
使用前缀++和--,因为后缀形式会发生一次临时对象的生成和拷贝。
11.const的使用
在适宜的地方尽量使用const。const声明可以让代码更具可读性,并且可以在编译期检测到可能存在的Bug。
如果传递引用参数,则应该总是const引用。
任何时候如果可以就应该将方法声明为const。Accessors应该总是声明为const。
如果一个数据成员在构建以后就不会再改为,则应该声明为const。
C++对整型的长度没有做出具体规定。在所有的整型中我们应该只使用int,其它长度的整型应使用&stdint.h&中具有明确长度定义的类型,如int32_t。
int应该使用在一些我们知道数值不会变得太大的场景,如循环计数器。尽可能使用标准类型size_t和ptrdiff_t。
不要使用无符号整型表示一个不可能为负的数,使用断言来检查它。
只在两种情况下使用无符号整型:表述一个位模式(进行位计算),有符号整型确实不够大。
使用无符号整型表示无符号数,如果用户传入负数时会发生类型转换,并且编译器可能不会给出警告,这可能造成难以发现的Bug。
13.64-bit Portability
代码应在32位平台和64位平台具有良好的可移植性。需要考虑3个问题:printing, comparisons, and structure alignment。
printf()规定的格式描述符没有明确指明变量的长度,使用&inttypes.h&中定义的PRI*宏来替代。
记住sizeof(void *) != sizeof(int),如果需要一个和指针长度相同的整型,使用intptr_t。
注意结构体的对齐,可以使用__attribute__((packed))控制结构体的对齐方式。
使用LL和ULL后缀来创建一个64位常量。
如果确实需要为32位和64位编写不同的代码,使用#ifdef _LP64来区分不同代码,但是你应该尽量避免这样做。
14.Preprocessor Macros
谨慎使用宏,尽可能???用内联函数,枚举和常量来替代。
使用宏时遵循如下规则可避免很多问题:
不要在.h文件中定义宏。
在即将使用到宏的地方再定义宏,使用完以后立刻#undef。
不要仅仅因为要定义你自己的版本而#undef一个已经存在的宏,你应该为宏选择一个唯一的名字。
不要使用##(在宏定义中用于连接字符串)来生成函数/类/变量名。
15.0 and nullptr/NULL
整型使用0,浮点使用0.0,字符使用'\0',指针使用nullptr (in C++11)或者NULL。
使用sizeof(varname)而不是sizeof(type)。这样当变量类型发生变化时不用修改相关的sizeof代码。
C++11可以使用auto关键来定义一个变量,变量的类型将根据它的初始化表达式进行推导。使用auto表达式可以避免重复书写很长的类型名,比如STL中的迭代器类型。
只将auto关键字用于局部变量。
只使用Boost库中approved的部分。
只使用C++11 (formerly known as C++0x)中approved的特性。2
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款2021人阅读
【C/C++开发语言系列】(25)
构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。在构造函数中也可以采用这样的方法来实现初始化。
例9.3的问题也可以使用包含默认参数的构造函数来处理。例9.4 将例9.3程序中的构造函数改用含默认值的参数,长、宽、高的默认值均为10。
在例9.3程序的基础上改写如下:
#include &iostream&
& &public :
& &Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参数
& &int volume( );
& &private :
Box::Box(int h,int w,int len) //在定义函数时可以不指定默认参数
& &height=h;
& &width=w;
& &length=
int Box::volume( )
& &return (height*width*length);
int main( )
& &Box box1; //没有给实参
& &cout&&″The volume of box1 is ″&&box1.volume( )&&
& &Box box2(15); //只给定一个实参
& &cout&&″The volume of box2 is ″&&box2.volume( )&&
& &Box box3(15,30); //只给定2个实参
& &cout&&″The volume of box3 is ″&&box3.volume( )&&
& &Box box4(15,30,20); //给定3个实参
& &cout&&″The volume of box4 is ″&&box4.volume( )&&
& &return 0;
程序运行结果为
The volume of box1 is 1000
The volume of box2 is 1500
The volume of box3 is 4500
The volume of box4 is 9000
程序中对构造函数的定义(第12-16行)也可以改写成参数初始化表的形式:
& &Box::Box(int h,int w,int len):height(h),width(w),length(len){ }
可以看到: 在构造函数中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。
它的好处是: 即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。尤其在希望对每一个对象都有同样的初始化状况时用这种方法更为方便。
关于构造函数默认值的几点说明:
应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。程序第5行在声明构造函数时,形参名可以省略。如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。
& &定义对象的时候,不能像下面调用默认的构造函数,编译器会理解为相当于声明了一个返回值为 Box对象的函数 &
& &Box box0();&&& &
& &应该按照这种方法进行调用无参的构造函数
& &Box box1; //调用无参的构造函数
& &普通的函数调用 如A & a.func1() &;则需要带有小括号来调用无参数的函数
&& 注意2:
& &定义了缺省参数的函数后(包括构造函数和成员函数,普通函数),就不能才定结构类似的重载函数了。
如定义了缺省构造函数
& &Box(int h=10,int
w=10,int len=10); //在声明构造函数时指定默认参数
& &//又定义了无参数的构造函数
& & & cout&&&Construcor calling &Box()&&&
则&Box &a; &//定义对象的时候可能调用无参的构造函数,也有可能调用Box(int
h=10,int w=10,int len=10); 的缺省形式。产生了二义性,编译器直接报错
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:616599次
积分:6333
积分:6333
排名:第2880名
原创:146篇
转载:38篇
评论:186条
(4)(27)(9)(2)(5)(3)(3)(2)(1)(1)(2)(1)(2)(5)(1)(1)(3)(1)(1)(2)(2)(1)(25)(6)(15)(1)(2)(6)(1)(3)(1)(3)(3)(6)(9)(3)(2)(1)(7)(6)(4)(1)

我要回帖

更多关于 google styleguide 的文章

 

随机推荐