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

C++函数声明的具体规则是什么?函数参数是否必须使用const修饰?

C++函数参数常量使用问题解答

核心结论

  • C++没有强制要求所有参数必须使用常量参数,但对于只读的输入参数,尤其是非基础类型,优先使用const引用是行业通用编码规范,核心收益包括:
    • 避免不必要的对象拷贝,提升运行性能
    • 接口语义清晰,明确告知调用者该参数不会被函数修改
    • 同时兼容const和非const类型的实参传入,适用范围更广

代码优化方案

你之前的误区是把「函数内部需要操作字符串」和「参数必须为可写」绑定了,其实完全可以将参数改为const引用,内部逻辑甚至可以做到不需要拷贝整个输入字符串,性能更好:

int numofsubstring(const string& s1, const string& s2)
{
    int nCount = 0;
    size_t pos = 0;
    // 直接利用find的第二参数指定查找起始位置,无需生成子串
    while ((pos = s1.find(s2, pos)) != string::npos) {
        nCount++;
        // 跳过当前匹配的子串,避免重复匹配重叠内容(如果需要支持重叠匹配可以改为pos+1)
        pos += s2.length();
    }
    return nCount;
}

优化点说明

  1. 参数定义优化
    • s2全程不会被修改,使用const string&直接省去调用时的字符串拷贝开销,字符串越长收益越明显
    • s1作为输入参数,函数本身没有修改原始传入变量的需求,用const string&符合最小权限原则,接口语义更清晰
  2. 内部逻辑优化
    你原有逻辑中每次调用substr生成新字符串、再赋值给s1的操作会带来多次不必要的内存分配和拷贝,直接通过find的第二个参数指定下次查找的起始位置,完全可以实现相同的统计效果,性能更高,逻辑更简洁。

补充说明

如果你的业务逻辑确实需要对输入字符串做修改才能完成计算,也可以保持参数为const引用,在函数内部创建局部可变副本操作即可,对外的接口依然可以保持const的承诺,不会破坏外部传入的变量值。

内容的提问来源于stack exchange,提问作者Manjunatha R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:02