C++ 函数、引用与 const
函数让逻辑可以被命名、复用和测试。
值传递
void inc(int x) {
++x;
}
值传递会复制参数,函数内修改不会影响外部变量。
引用传递
void inc(int& x) {
++x;
}
引用是已有对象的别名,适合需要修改原对象的场景。
const 引用
void print(const std::string& s);
大对象用 const& 可以避免复制,同时表达函数不会修改参数。
返回值
现代 C++ 返回对象通常不需要担心过多复制,编译器会做返回值优化。
函数签名就是接口
函数名、参数类型、返回值共同组成了一个接口。接口设计得清楚,调用者就少猜很多东西。比如下面两个函数表达的语义完全不同:
void normalize(std::string& text);
std::string normalized(std::string text);
第一个函数会修改传入对象,第二个函数返回一个新的字符串。没有哪一个绝对更好,关键是签名要诚实。
const 的价值
const 不是为了让代码看起来高级,而是为了约束可变性。函数参数加上 const& 后,读代码的人可以立刻知道这个函数不会修改参数;编译器也会帮助检查这种约束。
常见坑
不要返回局部变量的引用:
const std::string& bad() {
std::string s = "tmp";
return s;
}
函数返回后 s 已经销毁,引用会悬空。这类问题往往不会立刻报错,但非常危险。
评论
...正在读取评论。