3

私はこのコードを見つけました:

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

私が理解している限り、このクラスのコンストラクターは、クラスfooの別のオブジェクトをfoo唯一の引数として取ります。私には明らかでないのは、なぜ*前に を使用するのかということですarg。私の知る限り、参照によって引数を渡す場合、関数の「本体」でこの引数を通常の変数として扱う必要があります (変数のアドレスとしてではなく、つまりを使用しないでください*)。

4

3 に答える 3

5

演算子は.間接 ( *) 演算子よりも優先順位が高いため、コードは次のように解析されます。

*(arg.impl_)

impl_new で初期化するため、ポインタのように見えます。コピー コンストラクターを呼び出すには、ポインターではなくオブジェクトを渡す必要があるため、事前に逆参照する必要があります。

于 2013-04-04T15:46:14.007 に答える
3

これはコピー コンストラクターであり、const 参照(「オブジェクト」ではない) を引数として取ります。

クラス定義は示していませんが、

*arg.impl_

逆参照argimpl_を意味するのではなく、次のいずれかのように見えると呼ばれるメンバーを探します。

(*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 (または Pointer to Implementation) のイディオムのように見えます。

于 2013-04-04T15:47:43.420 に答える
1

impl_は へのポインタであり、impl(通常はそうであるように) コピー コンストラクタ パラメータとして参照を受け取ります。

于 2013-04-04T15:46:40.297 に答える