2

いつコピーされ、いつ C++ で参照されるのか、少し混乱しています。たとえば、引数が参照であるこの非常に単純なメソッドがあります。

void setTimeSig(const int &tsNumerator, const int &tsDenominator) {
    this->timeSigNum = tsNumerator;
    this->timeSigDenom = tsDenominator;
}

これは、関数 where が終了したときに参照を使用しているため、とを持つsetTimeSigオブジェクトはこれら 2 つのフィールドが空になるということですか? または、この時点でコピーされています:timeSigNumtimeSigDenomthis->timeSigNum = tsNumerator;

そして、同じことについてもう 1 つ質問します。

class A{
public:
    B bObject;
}
B b;
A a;
a.bObject = b;

現在 b を参照していbObjectますか、それともコピーが含まれていますか?

これについてどこで、または何を読むべきかについての情報は大歓迎です。私はまだ多くのことを混乱させています。

4

3 に答える 3

5

参照は、暗黙のポインターと考えることができます。意味的にはより複雑な意味を持つ可能性がありますが (つまり、参照はしばしば「バインドされている」と考えられ、バインドされませんNULL)、多くの場合、基礎となるコンパイラはそれらを自動的に逆参照されるポインターとして扱います。したがって、コンパイラの観点からは、コードは実際には次のようになります。

this->timeSigNum = *tsNumerator;
this->timeSigDenom = *tsDenominator;

したがって、参照自体の値はコピーされませんが、明示的なポインターを手動で逆参照した場合と同じように、参照がバインドされている元の変数の値がコピーされます。

于 2012-07-26T14:01:16.987 に答える
3

最初の例では、関数の引数によって参照される値をメンバー変数にコピーしています。

2 番目の例でも同じです。ここでは、オブジェクト b からオブジェクト a.bObject に値をコピーします。

operator= を使用するときは常に代入演算子を使用しています。これを行うデフォルトの方法は、いわゆる浅いコピーです。クラスに動的データがある場合は注意が必要です。動的データのアドレスをコピーするだけで、元のインスタンスまたはコピーされたインスタンスのいずれかでこのデータが破棄される可能性があるため、デフォルトのデータでは機能しないためです。この場合、ディープ コピーを実行する必要があります。つまり、代入演算子をオーバーロードして動的データを手動でコピーする必要があります。

ここでの浅いコピーと深いコピーの詳細:

http://www.learncpp.com/cpp-tutorial/912-shallow-vs-deep-copying/

コピー/割り当て演算子に関する同じソースからの詳細:

http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/

于 2012-07-26T14:11:08.033 に答える
0
  1. その時点でコピーされています: this->timeSigNum = tsNumerator;
  2. コピーが含まれています。

C++ は、明示的にものを参照として宣言する場合にのみ (ほとんど) 参照を使用します。

于 2012-07-26T14:00:54.030 に答える