C++其他特性(1)

引用参数


传引用的参数必须用const。

定义:


  在C编程,如果一个函数需要改变一个变量,参数必须是指针,例如intfoo(int *pval)。在C++中,函数可以声明参数为引用:intfoo(int &val)

有点:

   定义引用参数可以避免像(*pval)++的丑陋代码。这对于像拷贝构造函数的程序来说很有必要。很清楚,不像指针不能为null

缺点:

   引用引发混淆,因为它们有值的语法却有指针的语意。

决定:

   函数所有的引用参数必须是const

void Foo(const string &in, string*out);

 

实际上在google代码中这是个很强的规定,输入参数是值或const引用,输出参数是指针。输入参数可以是const指针,但是我们不允许非const引用参数,除非惯例需要。

然而,也有一些情况是用const T* const T&做输入参数要好:

1、 你必须传递一个null指针

2、  函数保存一个指针或引用到输入参数中。

记得大部分情况下,输入参数都应该指明为const T&。用const T* 反而告诉读者输入应该被不同处理。所以如果想用s are going to be specified as const T&. Using const T* instead communicates to the reader that the input is somehowtreated differently. So if you choose 而不是const T&,这么做的具体原因就是:不这么做可能混淆读者去找一个不存在的说明。

 

函数重载

   只有当读者看到函数调用处就可以看出函数的作用和功能,而不是需要先去确定调用哪个重载函数时,才有函数重载。

 定义:

     你可能写一个参数为const string&的函数和重载一个参数为const char*的函数。

class MyClass {
 public:
  void Analyze(const string &text);
  void Analyze(const char *text, size_t textlen);
};

优点:

重载同一个函数名但是带不同的参数的函数可以使得代码更直观。这对于模版代码很重要而且对访问者来说也很方便。

缺点:

如果仅仅通过不同参数类型不同进行重载,读者要了解怎么运行就必须知道C++负责的匹配规则。况且很多人可能都还困惑继承中的函数重写是怎么回事。

决定:

如果你要重载函数,考虑在函数名加上一些参数的信息。例如 AppendString()AppendInt() r而不仅仅是 Append().

默认参数

我们并不允许函数默认参数,除非在一下解释的限制情况下。如果可能,用函数重载来模拟它们。

优点:

我们经常会写参数带默认值的函数,但是有时又会重写这个默认值。默认参数提供了这样一种简单的方法而你又不用定义很多函数。与函数重载相比,默认参数具有简洁的语法,少量引用,能清楚的区分必须和可选参数。

缺点:

    默认参数中出现的函数指针经常会混淆,因为函数的签名经常跟调用出的签名不匹配。给存在的函数添加默认值会改变它的类型,取它的地址时可能就会出问题。添加函数重载几可以避免这些问题。除此之外,默认参数可能导致代码庞大,因为它们重复出现在每个调用处,不像函数重载,默认值只会出现在定义出。

决定:

虽然上面的缺点并不那么麻烦,它们仍过高估计默认参数的重要性超过函数重载。除了像以下说明的,我们需要所以的参数都是明确定义的。

一个特别的例外就是:当函数是cpp文件中的静态函数。在这种情况下,上面的缺点就不起作用了,因为函数的使用是在本地的。

另一个例外是:当默认参数是用来模拟变长参数列表时。

// Support up to 4 params by using a default empty AlphaNum.
string StrCat(const AlphaNum &a,
              const AlphaNum &b = gEmptyAlphaNum,
              const AlphaNum &c = gEmptyAlphaNum,
 

看变长度的数组aa

   我们不允许可变长度的数组和alloc

优点:

可变长度数组有着自然的语法。可变长度的数组和alloca都很有效率。

缺点:

可变长度的数组和alloca并不是标准C++的一部分。更重要的是,它们在堆上分配一个数据量相关的内存空间,可能引发内存重写方面的bug,在我的机子上可能运行得好好的,但是在产品中可能就崩掉了。

决定:

    用更安全的分配器替代它们,例如scoped_ptr/scoped_array.

 

友元

   我们允许合理的使用友元类和友元函数。

友元应该定义在同一个文件,这样读者不至于要到别的文件去找其用到的友元类的私有成员。常用的友元用法是:FooBuilder  作为Foo的一个友元,FooBuilder 能很好的创建Foo的状态。不用对外部暴露它的状态。在某些情况下,让单元测试类作为测试类的友元是很有用的。

   友元扩展了类,但并不打破类的封装性。如果你只想让一个别的类访问你的类,友元是比把成员放在public要好的。然而,大部分类应该只能通过public成员与其他类进行交互。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值