首页 / 软件开发 / C++ / Google C++编程风格指南(四):智能指针和其他C++特性
Google C++编程风格指南(四):智能指针和其他C++特性2010-09-211.对于智能指针,安全第一、方便第二,尽可能局部化(scoped_ptr); 2.引用形参加上const,否则使用指针形参;3.函数重载的使用要清晰、易读;4.鉴于容易误用,禁止使用缺省函数参数(值得商榷);5.禁止使用变长数组;6.合理使用友元……Google特有的风情Google有很多自己实现的使C++代码更加健壮的技巧、功能,以及有异于别处的C++的使用方式。1.智能指针(Smart Pointers)如果确实需要使用智能指针的话,scoped_ptr完全可以胜任。在非常特殊的情况下,例如对STL容器中对象,你应该只使用std::tr1::shared_ptr,任何情况下都不要使用auto_ptr。“ 智能”指针看上去是指针,其实是附加了语义的对象。以scoped_ptr为例,scoped_ptr被销毁时,删除了它所指向的对象。shared_ptr也是如此,而且,shared_ptr实现了引用计数(reference-counting),从而只有当它所指向的最后一个对象被销毁时,指针才会被删除。一般来说,我们倾向于设计对象隶属明确的代码,最明确的对象隶属是根本不使用指针,直接将对象作为一个域(field)或局部变量使用。另一种极端是引用计数指针不属于任何对象,这样设计的问题是容易导致循环引用或其他导致对象无法删除的诡异条件,而且在每一次拷贝或赋值时连原子操作都会很慢。虽然不推荐这么做,但有些时候,引用计数指针是最简单有效的解决方案。译者注:看来,Google所谓的不同之处,在于尽量避免使用智能指针:D,使用时也尽量局部化,并且,安全第一。其他C++特性1.引用参数(Reference Arguments)所以按引用传递的参数必须加上const。定义:在C语言中,如果函数需要修改变量的值,形参(parameter)必须为指针,如int foo(int *pval)。在C++中,函数还可以声明引用形参:int foo(int &val)。优点:定义形参为引用避免了像(*pval)++这样丑陋的代码,像拷贝构造函数这样的应用也是必需的,而且不像指针那样不接受空指针NULL。缺点:容易引起误解,因为引用在语法上是值却拥有指针的语义。结论:函数形参表中,所有引用必须是const:void Foo(const string &in, string *out);事实上这是一个硬性约定:输入参数为值或常数引用,输出参数为指针;输入参数可以是常数指针,但不能使用非常数引用形参。在强调参数不是拷贝而来,在对象生命期内必须一直存在时可以使用常数指针,最好将这些在注释中详细说明。bind2nd和mem_fun等STL适配器不接受引用形参,这种情况下也必须以指针形参声明函数。