我找到了这段代码:
foo::foo(const foo & arg) :
impl_(new impl(*arg.impl_))
{};
据我了解,这个类的构造函数将类foo
的另一个对象foo
作为唯一的参数。我不清楚的是为什么我们*
在前面使用arg
. 据我所知,当我们通过引用传递参数时,我们应该将函数“主体”中的这个参数视为普通变量(而不是变量的地址,即我们不应该使用*
)。
我找到了这段代码:
foo::foo(const foo & arg) :
impl_(new impl(*arg.impl_))
{};
据我了解,这个类的构造函数将类foo
的另一个对象foo
作为唯一的参数。我不清楚的是为什么我们*
在前面使用arg
. 据我所知,当我们通过引用传递参数时,我们应该将函数“主体”中的这个参数视为普通变量(而不是变量的地址,即我们不应该使用*
)。
The .
operator has higher precedence than the indirection (*
) operator, so your code is parsed as
*(arg.impl_)
impl_
appears to be a pointer, because you initialize it with new. To invoke the copy constructor, you have to pass an object, not a pointer, so you need to dereference it beforehand.
这是复制构造函数,它接受一个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(或指向实现的指针)习语。
Because impl_
is a pointer to a impl
, which takes a a reference as copy constructor parameter (as is usually the case).