我想知道采用const或nonconst参数的函数之间的区别

时间:2015-09-16 16:48:34

标签: c++

正如我从C++ Primer,fourth edition看到的那样,

  

“可能令人惊讶的是,虽然参数是函数内部的const,但是   编译器否则将fcn的定义视为我们将参数定义为普通int:“

void fcn(const int i) { /* fcn can read but not write to i */ }

void fcn(int i) { /* ... */ } // error: redefines fcn(int)

所以,如果我想定义两个函数,如下所示,

int func(const int i) { 
    return i;
}

int func(int i){
    i++;
    return i;
}

实际上,它们是两个不同的函数,但是当我编译它时,会有一条消息:error:redefinition of 'int func(int i)'。我可以像这样定义它们吗?有没有替代方法?

2 个答案:

答案 0 :(得分:1)

将值传递的参数(如int)复制到堆栈中, 那么如果你的函数需要一个' const int'作为一个参数,它不会改变从函数外部可以做的事情(它只是禁止你改变函数内部的值)。由于复制了参数,因此可以在const int上调用以int作为参数的函数(它不会修改参数,因为它获取了副本)。

因为从外面看不出任何差异'对于采用int和const int的函数之间的函数,编译器没有理由选择一个版本或另一个版本,这就是C ++规范声明它是相同函数的原因。

现在,如果你有一个带有引用f(int&)的函数和另一个带有const引用f(const int&)的函数,那么它是另一个故事:那么只有第二个可以用const调用int参数,如:

const int x=5;
f(x);

答案 1 :(得分:-1)

const只是修改了如何访问变量,它不会改变它的数据类型,只要编译器关注它们都是整数以及它们是如何存储的,无论是否可修改。 / p>

我看到的唯一解决方法是通过更改参数的数据类型来重载函数,可能是long,double,byte等。