4

サンプルコード:

MyItemType a;
MyItemType b;
a.someNumber = 5;
b = a;

cout << a.someNumber << endl;
cout << b.someNumber << endl;

b.someNumber = 10;

cout << a.someNumber << endl;
cout << b.someNumber << endl;

出力:

5
5
5
10

aとbが参照型の場合、最後の2行は5と10ではなく10と10になります。

これは、次のような宣言を行う場合を意味しますか?

AClassType anInstance;

値型のように扱われますか?

------これがMyItemType.hです------------

#ifndef MYITEMTYPE_H
#define MYITEMTYPE_H

class MyItemType{

public:
    int someNumber;
    MyItemType();
};

MyItemType::MyItemType(){
}

#endif  /* MYITEMTYPE_H */
4

6 に答える 6

8

基本的にはそうです(C ++と同等の意味をJavaと同じと見なす場合)。

AClassType anInstance;はオブジェクトであり、参照ではありません。MyItemType aMyItemType bは異なるオブジェクトであり、異なるメモリスペースに存在するため、一方を変更しても他方には影響しません。

を実行する場合a=b、一方のオブジェクトをもう一方のオブジェクトと参照することはありませんが、この場合、メンバーごとの割り当てを実行します。基本的に言うようなものです

a.someNumber = b.someNumber;
于 2012-11-29T20:09:29.337 に答える
6

値型のようには扱われませんが、実際はそうです。

Javaでは、オブジェクト変数はオブジェクトへの参照を格納しますが、C ++では、オブジェクトとその参照の間に重要な違いがあります。割り当ては、デフォルトでは実際には値によって行われます。

変数を単なる参照にしたい場合は、使用したいものに応じて、参照型またはポインター型のいずれかを使用します。これらのタイプは宣言されT*T&います。

これをもう少し説明するために:

Javaでは、と言うとMyClass objオブジェクトが作成されますが、参照/ポインタは変数に格納されますobj

C ++ではMyClass obj、オブジェクトを作成し、に保存しobjます。MyClass* objPointer 参照/ポインタを操作する場合は、変数を明示的にまたはとして宣言する必要がありますMyClass& objReference

于 2012-11-29T20:12:40.053 に答える
4

C ++では、オブジェクトは、ポインター参照なしで作成された場合、静的(スタック)変数と呼ばれます。動的(ヒープ)変数は、手動のメモリ管理を必要とするポインタ参照です。

対照的に、JavaまたはC#では、ほとんどすべてのオブジェクトは、ガベージコレクションされることを除いて、ポインターのように動作する参照型ですが、値型は、一般に不変であるすべてのオブジェクトの特別なサブセットです。(C ++スタック変数は確かに不変ではありません)。

于 2012-11-29T20:14:09.723 に答える
4

C ++はオブジェクトの値型または参照型を呼び出しませんが、値型と参照型の動作はC++でも同等です。

与えられた2つのオブジェクトaba = b

  1. 値型は、の内容をコピーして、それらを別々のオブジェクトba保ちます。
  2. b参照型はの場所をにコピーaし、同じオブジェクトを参照するようにします。

C ++の場合:

MyClass  a;      // value type
MyClass  b;      // value type
MyClass &c =  a; // reference type (a reference in C++), fixed to a
MyClass *d = &b; // reference type (a pointer in C++)

 a =  b; // copy content of b into a
 c =  b; // copy content of b into a
 d = &a; // set d to refer to a
*d =  b; // copy content of b into a

ポインタ/参照は、値オブジェクト、割り当てられたオブジェクト、newまたはその他のメモリ管理スキーム(mallocWin32などCoTaskMalloc)への参照である可能性があります。

于 2012-11-29T20:23:33.737 に答える
2

簡単な説明はこの重要な部分にあります

b = a;

コピー代入演算子を使用しています。これは、ここでこの記号を意味します=

この演算子のデフォルトの動作はメンバーごとのコピーを適用することです。したがって、独自の演算子を定義/オーバーロードしない場合、この行はa、の対応するメンバーのすべてのメンバーに格納されているすべての値をコピーしますb

オペレーターはnewまったく別の話です。ヒープにオブジェクトを割り当て、スタックや不要なコピーを回避するポインターを使用してオブジェクトを管理するためによく使用されます。

于 2012-11-29T20:14:58.877 に答える
0

デフォルトでは、C ++はそのクラスを値型として扱い、深い(要素ごとの)コピーを作成します。

ただし、メンバー変数をクラス内の空きストレージ(ヒープ上)に格納し、代入演算子(コード内のb = a)の動作をカスタマイズ(オーバーライド)して、参照型の動作を表示することができます。

これ(および他のいくつかの「トリック」)は、たとえば、shared_ptrスマートポインターがどのように設計されているかを示しています。これはC++クラスであり、コピーの頻度に関係なく、各インスタンスが同じ元のデータを参照します。

于 2020-06-03T17:49:44.820 に答える