C++ 我想知道取常量或非常量参数的函数之间的区别

C++ 我想知道取常量或非常量参数的函数之间的区别,c++,C++,正如我在《C++入门》第四版中看到的那样 “令人惊讶的是,尽管参数是函数中的常量,但 否则,编译器将fcn的定义视为我们将参数定义为普通int:“ 如果我想定义两个函数,如下所示 int func(const int i) { return i; } int func(int i){ i++; return i; } 实际上,它们是两个不同的函数,但是当我编译它时,有一条消息:错误:重新定义'int func(int I)'。我可以这样定义它们吗?是否有其他方法?通

正如我在《C++入门》第四版中看到的那样

“令人惊讶的是,尽管参数是函数中的常量,但 否则,编译器将fcn的定义视为我们将参数定义为普通int:“

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

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

int func(int i){
    i++;
    return i;
}
实际上,它们是两个不同的函数,但是当我编译它时,有一条消息:
错误:重新定义'int func(int I)'
。我可以这样定义它们吗?是否有其他方法?

通过值(如int)传递的参数被复制到堆栈上, 然后,如果您的函数以“const int”作为参数,则它不会更改从函数外部可以执行的操作(只是禁止您更改函数内部的值)。由于参数是复制的,因此可以对常量int调用以int为参数的函数(因为它获得了副本,所以不会修改参数)

由于在int和const int之间的函数之间没有区别,所以编译器没有理由选择一个或另一个版本,这就是为什么C++规范声明它是相同函数的原因。 现在,如果您有一个函数接受一个引用f(int&),另一个函数接受一个常量引用f(const int&),这是另一个故事:那么只有第二个函数可以用一个常量int参数调用,如中所示:

const int x=5;
f(x);

const只是修改您访问变量的方式,它不会更改其数据类型,就编译器而言,它们都是整数,无论是否可修改,它们都是这样存储的


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

它们是同一函数的两个定义(
int func(int)
),如您引用的段落所述。没办法,你想干什么?您是按值传递的,因此在任何情况下都不会更改原始值。您只是说复制到函数中的临时值不会在函数中更改。调用者将无法确定要调用哪个参数。“虽然参数是函数中的常量,但编译器将定义[…]视为我们在中定义为普通参数”的哪一部分不清楚?
const int x=5;
f(x);