我有以下函数声明:
void fn(int);
此函数具有单个整数类型参数。现在,我可以通过传递非const或const积分对象来调用此函数。在任何一种情况下,此函数都会将对象复制到其本地int参数。因此,对此参数的任何修改都将是函数的本地修改,并且不会以任何方式影响调用方的实际参数。现在我的问题是在哪种情况下我会将这个单个int参数声明为const类型?我认为没有必要按如下方式声明此功能。
void fn(const int);
这是因为参数无论如何都要通过值传递,并且函数在任何情况下都不能修改参数。据我所知,通过声明参数常量,函数无法在其体内修改它。但是,即使函数修改也没有缺点,因为参数是函数的本地参数。
答案 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引用传递它。现在的编译器是聪明的,我不明白他们为什么不能这样做。