• C++函数参数的编写


    参数的编写涉及到很多注意点,包括传值还是传地址,传地址的话选择指针还是引用,是否添加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*>

     

  • 相关阅读:
    OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程
    OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
    努比亚(nubia) M2青春版 NX573J 解锁BootLoader 并进入临时recovery ROOT
    华为 荣耀 等手机解锁BootLoader
    青橙 M4 解锁BootLoader 并刷入recovery ROOT
    程序员修炼之道阅读笔03
    冲刺8
    典型用户模板分析
    学习进度八
    冲刺7
  • 原文地址:https://www.cnblogs.com/towik/p/3199676.html
Copyright © 2020-2023  润新知