You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:23:18