【问题标题】:Why do we treat a passed by reference values as an address?为什么我们将通过引用传递的值视为地址?
【发布时间】:2013-04-04 15:43:58
【问题描述】:

我找到了这段代码:

foo::foo(const foo & arg) :
     impl_(new impl(*arg.impl_))
{};

据我了解,foo 类的构造函数将foo 类的另一个对象作为唯一参数。我不清楚的是为什么我们在arg 前面使用*。据我所知,当我们通过引用传递参数时,我们应该将函数“主体”中的这个参数视为普通变量(而不是变量的地址,我们不应该使用*)。

【问题讨论】:

    标签: c++ syntax constructor pass-by-reference


    【解决方案1】:

    . 运算符的优先级高于间接 (*) 运算符,因此您的代码被解析为

    *(arg.impl_)
    

    impl_ 似乎是一个指针,因为你用 new 初始化它。要调用复制构造函数,您必须传递一个对象,而不是指针,因此您需要事先取消引用它。

    【讨论】:

      【解决方案2】:

      这是复制构造函数,它以 const 引用(不是“对象”)作为其参数。

      你没有显示类定义,但是

      *arg.impl_
      

      并不意味着取消引用arg,然后寻找一些名为impl_的成员,这看起来像:

      (*arg).impl_
      arg->impl_
      

      它的意思是取消引用指针arg.impl_,即:

      *(arg.impl_)
      

      这是为impl_ 的任何类型调用等效的复制构造函数。


      示例:

      struct Impl {
          int i_;
      
          Impl() : i_(0) {}
          Impl(const Impl& other) : i_(other.i_) {}
      };
      
      struct Foo {
          Impl *impl_;
      
          // Foo::Foo calls Impl::Impl
          Foo() : impl_(new Impl()) {}
      
          // Foo::Foo(const Foo&) calls Impl::Impl(const Impl&)
          Foo(const Foo& other) : impl_(new Impl(*other.impl_)) {}
      };
      

      注意。这看起来像 pimpl(或指向实现的指针)习语。

      【讨论】:

        【解决方案3】:

        因为impl_ 是一个指向impl 的指针,它接受一个引用作为复制构造函数参数(通常是这种情况)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-25
          • 1970-01-01
          • 2021-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多