为什么我们将传递的参考值视为地址?

时间:2013-04-04 15:43:58

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

我找到了这段代码:

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

据我所知,类foo的构造函数将类foo的另一个对象作为唯一参数。我不清楚的是为什么我们在*前面使用arg。据我所知,当我们通过引用传递参数时,我们应该在" body"中处理这些参数。作为正常变量的函数(而不是作为变量的地址,我们不应该使用*)。

3 个答案:

答案 0 :(得分:5)

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

*(arg.impl_)

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

答案 1 :(得分:3)

这是复制构造函数,它将 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_)) {}
};

NB。这看起来像 pimpl (或指向实现的指针)。

答案 2 :(得分:1)

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