代码之家  ›  专栏  ›  技术社区  ›  Cedric H.

关于推荐人的问题

c++
  •  1
  • Cedric H.  · 技术社区  · 16 年前

    拥有这个:

    int main()
    {
        int a = 10;
        f(a);
        return 0;
    }
    

    两者有什么区别

    void f(int& a)
    {
        int& b = a;
    }
    

    和

    void f(int& a)
    {
        int b = a;
    }
    

    特别是在 f 而是类的构造函数,而不是 int 我们有个大目标。

    我同意第二种可能性。。。你怎么认为?

    编辑:

    首先,看看答案,当我发布问题的时候,我以为我已经脑死亡了,但实际上我发现了有趣的子问题(和答案!)在评论中。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Philip Potter    16 年前

    void f(int& a) {
        int& b = a;
    }
    

    打电话的人进来了 a . 然后我们创建一个新的引用 b 指的是 一 ,仍然是来电者的 . 因此,调用者所做的任何更改都将对用户可见 f 以及它的包含类,以及 f 或者 一 或 b 一 .

    void f(int& a) {
        int b = a;
    }
    

    在这里, 是一个新变量 int ,这需要 复制 属于 一 b 不会影响来电者,来电者也不会影响 b . 但写同样东西的一个更快的方法是:

    void f(int b) {
    }
    

    并免除 一 void f (int &a) 表示它 可以 修改 .

    编辑:如果您需要避免任何复制,第三个选项(tm)是对const的引用:

    void f(const int &a) {
        const int &b = a;
    }
    

    f ,也不是 一 b 可以修改,所以它不会影响调用者,但是通过使用对const的引用可以避免复制。还有一个潜在的问题 一 一

        2
  •  4
  •   Thomas Lötzer    16 年前

    int& b = a 不复制, int b = a

        3
  •  2
  •   Uli Schlachter    16 年前

    第二个版本创建变量的副本,而第一个版本只生成对原始对象的另一个引用。如果您只有一个引用,那么如果调用者销毁了他的对象,就会发生坏事情(tm)。因此,您很可能希望使用第二个版本(除非您可以确定使用引用是安全的)。