我找到了这段代码:
foo::foo(const foo & arg) :
impl_(new impl(*arg.impl_))
{};
据我所知,类foo
的构造函数将类foo
的另一个对象作为唯一参数。我不清楚的是为什么我们在*
前面使用arg
。据我所知,当我们通过引用传递参数时,我们应该在" body"中处理这些参数。作为正常变量的函数(而不是作为变量的地址,即我们不应该使用*
)。
答案 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
的指针,它将引用作为复制构造函数参数(通常就是这种情况)。