参数的编写涉及到很多注意点,包括传值还是传地址,传地址的话选择指针还是引用,是否添加const

1. 传值还是传地址。

    (1)如果是int这种简单内置类型,然后又不需要传出修改的结果的话,就用传值,如void Test(int a); 这时候毫无疑问不需要使用 void Test(cont int* a); 原因是函数编写和调用都麻烦,很诡异。但是有的人可能会想,是不是这样会提高效率。但是其实是错的,因为指针本身也是一个32位的值,就像int一样,所以如果是简单内置类型,这种情况还是选择老老实实的传值吧。有的人,包括曾经的自己会极端的试图使用void Test(const int& a);  也是以提高效率的名义,但是还是错的,因为引用其实本质上用到了指针,两者是一伙的。

    (2)如果是结构类型或者类类型,能传地址就传地址。理由很简单,提高效率。有的人会反驳说,我的这个结构或者类很小的,影响不大,我就喜欢传值。那我要反对这种反驳,你怎么知道在N天之后,这个结构或者类不会变大呢?

2. 传地址选择指针还是引用。

    (1)首先,引用跟指针是有区别的,引用不能为空,引用不能修改引用的对象。在引用初始化的时候,就确定了它所引用的对象,如果int a = 0; int& b = a; 如果你来个int c = 1; b = c; 有的初学者会以为此时b变成引用c了,其实错了。引用比我们想象的专一,b始终引用着a,至死不渝。b = c; 其实是修改了a对应的内存中的值,所以此时,ab都变成了1

    (2)有的观点认为,除非你要指向NULL或者修改指向,,否则你就应该用引用,而不是指针。我基本认同这个观点,引用可以认为是更严格的指针,能使用更严格的指针就使用它,这就像能使用const的时候就使用它一样,基本正确。但是最近看了下Google C++的编程规范,里面讲到了传入参数用const引用,传出参数用指针,有它的道理。如果传出参数使用引用,比如void Test(CString& a),虽然可以规定说,const CString&,表示不会修改引用的对象,CString& 表示修改了引用的对象,但是仅看调用方的代码,Test(temp),你是看不出来形参是CString呢,还是CString&的,所以就郁闷了。所以Google的规范还是有道理的,传出参数统一用指针,调用的时候就是Test(&temp); 别人一看这代码,一想规则就知道,这里肯定把temp修改了。

 

3. 是否为const

(1)如果是传值,比如int,这种的话不管是否为const,都不会修改调用方的值,这里const限制的是参数在函数内是否可被修改。这种情况一般不需要加const,除非你需要明确禁止在函数内修改。

(2)如果是传地址。const与指针和引用结合能发挥很大的作用,比如const CString&, const CString*, 当你确定在函数内不会修改指向的值时,就应该加上const,一来可以防止你在编写函数的时候不小心修改,而来可以明确的告诉调用方,放心的传进来吧,我不会修改你的。还有一个好处是,调用方拿着一个const CString& 或 const CString* 的时候,他不用恶心的来个const_cast<CString&> 或 const_cast<CString*>

 

posted on 2013-07-18 23:31  阳光不锈  阅读(767)  评论(0编辑  收藏  举报