const修辞函数参数

  • Post author:
  • Post category:其他


const修饰函数参数



(1)传递过来的参数及指针本身在函数内不可变,无意义!

void func(const int var); // 传递过来的参数不可变
void func(int *const var); // 指针本身不可变



表明参数在函数体内不能被修改,但此处没有任何意义,var本身就是形参,在函数内不会改变。包括传入的形参是指针也是一样。



输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。



(2)参数指针所指内容为常量不可变

void StringCopy(char *dst, const char *src);



其中src 是输入参数,dst 是输出参数。给src加上const修饰后,如果函数体内的语句试图改动src的内容,编译器将指出错误。这就是加了const的作用之一。



(3)参数为引用,为了增加效率同时防止修改。

void func(const A &a)



对于非内部数据类型的参数而言,象void func(A a) 这样声明的函数注定效率比较低。因为函数体内将产生A 类型



的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。



为了提高效率,可以将函数声明改为void func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临



时对象。但是函数void func(A &a) 存在一个缺点:



“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为



void func(const A &a)。



以此类推,是否应将void func(int x) 改写为void func(const int &x),以便提高效率?完全没有必要,因为内部数



据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。



小结:对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void func(A a) 改为void func(const A &a)。

对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void func(int x) 不应该改为void func(const int &x)。



以上解决了两个面试问题:



(1)如果函数需要传入一个指针,是否需要为该指针加上const,把const加在指针不同的位置有什么区别;



(2)如果写的函数需要传入的参数是一个复杂类型的实例,传入值参数或者引用参数有什么区别,什么时候需要为传入的引用参数加上const。



版权声明:本文为Monica_uu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。