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; }
优化点说明
- 参数定义优化
s2全程不会被修改,使用const string&直接省去调用时的字符串拷贝开销,字符串越长收益越明显s1作为输入参数,函数本身没有修改原始传入变量的需求,用const string&符合最小权限原则,接口语义更清晰
- 内部逻辑优化
你原有逻辑中每次调用substr生成新字符串、再赋值给s1的操作会带来多次不必要的内存分配和拷贝,直接通过find的第二个参数指定下次查找的起始位置,完全可以实现相同的统计效果,性能更高,逻辑更简洁。
补充说明
如果你的业务逻辑确实需要对输入字符串做修改才能完成计算,也可以保持参数为const引用,在函数内部创建局部可变副本操作即可,对外的接口依然可以保持const的承诺,不会破坏外部传入的变量值。
内容的提问来源于stack exchange,提问作者Manjunatha R
相关产品推荐
相关产品推荐

