- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5. 其他 C++ 特性
5.1. 引⽤参数
Tip
所以按引⽤传递的参数必须加上 const.
定义:在 C 语⾔中, 如果函数需要修改变量的值, 参数必须为 针, 如 int foo(int
*pval). 在 C++ 中, 函数还可以声明引⽤参数: int foo(int val).优点:定义引⽤
参数防⽌出现 (*pval)++ 这样丑陋的代码. 像拷贝构造函数这样的应⽤也是必需的.
⽽且更明确, 不接受 NULL 针.缺点:容易引起误解, 因为引⽤在语法上是值变量却拥
有 针的语义.结论:函数参数列表中, 所有引⽤参数都必须是 const:
void Foo(const string in, string *out);
事实上这在 Google Code 是⼀个硬性约定: 输⼊参数是值参或 const 引⽤, 输出参数为
针. 输⼊参数可以是 const 针, 但决不能是 ⾮ const 的引⽤参数.
在以下情况你可以把输⼊参数定义为 const 针: 你想强调参数不是拷贝⽽来的, 在
对象⽣存周期内必须⼀直存在; 最好同时在注释中详细说明⼀下. bind2nd 和
mem fun 等 STL 适配器不接受引⽤参数, 这种情况下你也必须把函数参数声明成 针
类型.
5.2. 函数重载
Tip
仅在输⼊参数类型不同, 功能相同时使⽤重载函数 (含构造函数) . 不要⽤
函数重载模拟 缺省函数参数 .
定义:你可以编写⼀个参数类型为 const string 的函数, 然后⽤另⼀个参数类型为
const char* 的函数重载它:
class MyClass {
public:
void Analyze(const string text);
void Analyze(const char *text, size t textlen);
};
优点:通过重载参数不同的同名函数, 令代码更加直观. 模板化代码需要重载, 同时为使
⽤者带来便利.缺点:限制使⽤重载的⼀个原因是在某个特定调⽤点很难确定到底调⽤
的是哪个函数. 另⼀个原因是当派⽣类只重载了某个函数的部分变体, 会令很多⼈对继
承的语义产⽣困惑. 此外在阅读库的⽤户代码时, 可能会因反对使⽤ 缺省函数参数
[http://code .google .com/p/google-gflags/] 造成不必要的费解.结论:如果你想重载⼀个函
数, 考虑让函数名包含参数信息, 例如, 使⽤ AppendString(), AppendInt() ⽽不
是 Append().
5.3. 缺省参数
Tip
我们不允许使⽤缺省函数参数.
优点:多数情况下, 你写的函数可能会⽤到很多的缺省值, 但偶尔你也会修改这些缺省
值. ⽆须为了这些偶尔情况定义很多的函数, ⽤缺省参数就能很轻松的做到这点.缺点:
⼤家通常都是通过查看别⼈的代码来推断如何使⽤ PI . ⽤了缺省参数的代码更难维
护, 从⽼代码复制粘贴⽽来的新代码可能只包含部分参数. 当缺省参数不适⽤于新代码
时可能会导致重⼤问题.结论:我们规定所有参数必须明确 定, 迫使程序员理解 PI 和
各参数值的意义, 避免默默使⽤他们可能都还没意识到的缺省参数.
5.4. 变长数组和 alloca()
Tip
我们不允许使⽤变长数组和 alloca().
优点:变长数组具有浑然天成的语法. 变长数组和 alloca() 也都很⾼效.缺点:变长数
组和 alloca() 不是标准 C++ 的组成部分. 更重要的是, 它们根据数据⼤⼩动态分配
堆栈内存, 会引起难以发现的内存越界 bugs: “在我的机器上运⾏的好好的, 发布后却莫
名其妙的挂掉了”.结论:使⽤安全的内存分配器, 如 scoped ptr / scoped array.
5.5. 友元
Tip
我们允许合理的使⽤友元类及友元函数.
通常友元应该定义在同⼀⽂件内, 避免代码读者跑到其它⽂件查找使⽤该私有成员的
类. 经常⽤到友元的⼀个地⽅是将 FooBuilder 声明为 Foo 的友元, 以便
FooBuilde
原创力文档


文档评论(0)