2

以下を考えると:

class ParamClass {...};

class MyObject {
public:
    void myMethod(ParamClass const& param) { _myPrivate = param; }

private:
    ParamClass _myPrivate;
}

[...]

MyObject obj;

void some_function(void)
{
    ParamClass p(...);
    obj.myMethod(p);
}

オブジェクト p の存続期間が終了すると、_myPrivate はどうなりますか? 編集: _myPrivate を使用してオブジェクト p のコピーにアクセスできますか?

ありがとう!

ダン

4

4 に答える 4

7

_myPrivateは参照ではないため、代入_myPrivate = paramでは、その値は参照がparam指すものからコピーされます。この場合、ローカル変数psome_function()です。

したがって、代入演算子ParamClassが正しく実装されていれば、コードは問題ないはずです。

_myPrivate を使用してオブジェクト p のコピーにアクセスすることはできますか?

上記の警告で、はい。しかし正確には、 のコピーへのアクセス_myPrivateには使用できません。これ(現在消滅している) のデータのコピーを含む変数です。pp

于 2011-02-01T14:59:02.693 に答える
0

デフォルトでオブジェクトのビットごとのコピーを作成するmyMethod代入演算子を呼び出します(独自の演算子を定義できます)。ParamClassしたがって、アクセス可能な p のコピーを作成します

于 2011-02-01T14:59:44.970 に答える
0

を見てみましょう:

_myPrivate = param;

このステートメントでは、代入演算子 ( ) は、 によって参照されるParamClass::operator=オブジェクトの各メンバーの値を のメンバーにコピーします。戻ると、スタックから移動されます-消えます。しかし、現在は'members' の値のコピーが含まれています。param_myPrivatesome_functionp_myPrivatep

ParamClass動的に割り当てられたメモリへのポインターであるメンバーがある場合、 がディープ コピーParamClass::operator=を実行していることを確認する必要があります。そうしないと、ポインターがぶら下がって問題が発生する可能性があります。ParamClass_myPrivate

于 2011-02-01T15:24:56.810 に答える
0

A reference is like an alias to an object. The reference has no lifetime of its own. The lifetime to consider is the lifetime of the object referenced.

In your example, _myPrivate is an object so the operator= will copy the reference-passed objet p. p will be destroyed, and the parameter reference will reference nothing, but _myPrivate, as a copy will be OK.

It would be a problem if _myPrivate was declared as :

ParamObject& _myPrivate;

In this case, you end up with a "dangled" reference : Undefined behavior :)

my2c

于 2011-02-01T15:11:27.677 に答える