C++中按值传递常量时,为何其副本无需是常量?
为什么常量变量可以传递给非const函数参数并修改?
先看你提供的可运行代码(g++ 13.1.0编译运行输出“Sum is 20”):
#include <iostream> using namespace std; void add (int x, int y, int sum); int main(){ int x = 10, y = 10; const int sum = 0; add (x, y, sum); return 0; } void add (int x, int y, int sum) { sum = x + y; cout << "Sum is " << sum << endl; }
你疑惑的点在于:为什么把const int类型的sum传给非const的函数参数,编译器不报错,函数还能修改这个参数?核心原因是值传递的机制:
- 当你调用
add(x, y, sum)时,函数的三个参数都是按值传递的——函数会为每个参数创建一个独立的局部副本,用传入的值来初始化这些副本。 main里的sum是const变量,这只限制你不能直接修改它本身,但读取它的值是完全合法的。用这个值去初始化add函数里的非const局部参数sum,完全符合C++的语法规则。add函数里修改的只是这个局部的副本,和main里的原常量sum没有任何关联——原常量的值始终是0,不会被函数操作改变。
说白了,const变量的约束只针对它自己的修改操作,不限制它的值被复制给其他变量。而值传递的参数本身就是独立的新变量,修改它不会触碰原const变量,所以编译器不会报错,程序能正常运行。
内容的提问来源于stack exchange,提问作者Arjun Viswanathan
相关产品推荐
相关产品推荐

