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 已经销毁,引用会悬空。这类问题往往不会立刻报错,但非常危险。

评论

...

正在读取评论。