在什么情况下你会声明一个非引用的非指针类型函数参数const?

时间:2010-09-05 02:47:44

标签: c++

我有以下函数声明:

void fn(int);

此函数具有单个整数类型参数。现在,我可以通过传递非const或const积分对象来调用此函数。在任何一种情况下,此函数都会将对象复制到其本地int参数。因此,对此参数的任何修改都将是函数的本地修改,并且不会以任何方式影响调用方的实际参数。现在我的问题是在哪种情况下我会将这个单个int参数声明为const类型?我认为没有必要按如下方式声明此功能。

void fn(const int);

这是因为参数无论如何都要通过值传递,并且函数在任何情况下都不能修改参数。据我所知,通过声明参数常量,函数无法在其体内修改它。但是,即使函数修改也没有缺点,因为参数是函数的本地参数。

5 个答案:

答案 0 :(得分:4)

你对调用者来说没有区别 - 它只对函数内部有用。我希望随时添加const。当我正在编写函数时,我在想“我想要这个参数,但无意修改它(甚至只是在本地)”,编译器会让我诚实。

此外,在某些情况下,如果编译器知道变量是const(如在循环边界中),则编译器可以进行更多优化。

答案 1 :(得分:1)

有时模板是以一般方式编写的,最终会做出类似的事情。但是,使用函数模板参数推导,const往往会被抛弃。

this实际上是const参数。它是一个指针,但就你的例子而言它是不可变的。 (当然,this是关键字,而不是变量,并且一元&不能使用它。)如果您希望参数的行为与此类似,请将其声明为const

答案 2 :(得分:1)

仅仅因为它被允许,并不意味着它有一点意义。

如果这可能导致超载行为略有不同,我不会感到惊讶,但我认为你基本上是对的 - 没有好的外部功能。

一个可能的问题是让那些可能认为你想要引用的读者感到困惑,但忘了“&”。

答案 3 :(得分:1)

来自C ++ Spec:http://www.kuzbass.ru:8086/docs/isocpp/over.html

  

不同的参数声明   只有在有或没有的情况下   const和/或volatile是等价的。   也就是说,const和volatile   每个参数的类型说明符   确定时忽略类型   正在声明哪个功能,   定义或调用。

示例:

typedef const int cInt;

int f (int);
int f (const int);              //  redeclaration of  f(int)
int f (int) { ... }             //  definition of  f(int)
int f (cInt) { ... }            //  error: redefinition of  f(int)

答案 4 :(得分:0)

C ++访谈中最喜欢的面试问题是传递值,传递指针和传递引用之间的区别是什么。

在这种情况下,我们通过值传递,而且也是int,因此无关紧要。但我不确定用户创建的类。在这种情况下,当编译器看到对象是由const值传递时,它可能决定通过const引用传递它。现在的编译器是聪明的,我不明白他们为什么不能这样做。