定義は次のとおりです。
クラスを使用したオブジェクト指向プログラミングでは、インスタンス変数はクラスで定義された変数(つまりメンバー変数)です//この部分を取得します
、クラスの各オブジェクトに個別のコピーがあります。//この部分は取得できません。
オブジェクトに個別のコピーを作成するにはどうすればよいですか?何の別のコピー?
基本的な質問をしてすみません、私はまだ初心者です。
ありがとうございました
定義は次のとおりです。
クラスを使用したオブジェクト指向プログラミングでは、インスタンス変数はクラスで定義された変数(つまりメンバー変数)です//この部分を取得します
、クラスの各オブジェクトに個別のコピーがあります。//この部分は取得できません。
オブジェクトに個別のコピーを作成するにはどうすればよいですか?何の別のコピー?
基本的な質問をしてすみません、私はまだ初心者です。
ありがとうございました
[コメント回答] インスタンス変数は、宣言された各オブジェクトのインスタンスを持つ変数です。クラス変数は、そのタイプで宣言されたすべてのオブジェクトに対して1つしかない単一のメンバー変数です。クラス変数はキーワードstaticを使用しますが、インスタンス変数は使用しません!
[ORIGINAL] クラスを定義すると、メンバー宣言があります。
そのクラスタイプの変数が定義されるまで、オブジェクトは実際にはインスタンス化されません(またはメモリスペースが与えられません)。
次に、そのクラスタイプを2つ定義すると、それらのオブジェクトには独自のメモリスペースが与えられ、実際、各オブジェクトの各メンバーには独自のメモリがあります(したがって、そのオブジェクトの2つの個別のインスタンス化)。
これで、(オブジェクト内の)データの各グループを個別に操作できます。
クラス変数:
http://en.wikipedia.org/wiki/Class_variable
インスタンス変数:
2つのオブジェクトがある場合、各オブジェクトにはインスタンス変数の独自のコピーがあります。つまり、同じ値を付けても、a.x
とは異なります。b.x
私は別のひどいエッチ・ア・スケッチを作りました、そしてそれであなたの目を燃やさなければなりませんでした。それが理解の問題を解決するなら、素晴らしいです!
だから、私たちはクラスを持っています、それを呼びますFoo
。示されているように、Foo
いくつかの静的メンバーがあります:
x
、、y
z
上部に、オブジェクト以外のアクセスが表示されます。これは、オブジェクトなしでこれらの静的メンバーにアクセスできることを意味します。実際、オブジェクトは開始前に存在するため、アクセスする前にオブジェクトを作成する必要はありませんmain
。
struct Foo {
static int x, y, z;
};
int Foo::x = 3;
int Foo::y = 1;
int Foo::z = 8;
int main() {
std::cout << Foo::y;
Foo::x = 6;
}
次に、2つのオブジェクトのインスタンスメンバーを含む他のサークルがあります。
struct Foo {
int a;
int b;
int c;
Foo (int a2, int b2, int c2)
: a (a2), b (b2), c (c2){}
};
int main() {
Foo obj1 (6, 9, 10);
Foo obj2 (3, 2, 4);
std::cout << obj1.a; //outputs 6
std::cout << obj2.a; //outputs 3 - different
obj1.z = 100;
std::cout << obj2.z; //outputs 100 - same
std::cout << Foo::z; //outputs 100
}
変数にアクセスするために、メンバー関数と静的関数を挿入することもできます。
struct Foo {
int getA() const {return a;}
void setA (int newA) {a = newA;}
static int getX() const {return x;}
static void setY (int newY) {return y;}
static void setB (int newB) {
b = newB; //error: static functions can't access instance members
}
}
int main() {
Foo obj1 (6, 9, 10);
std::cout << obj1.getX(); //outputs 3
Foo::setY (5);
obj1.setA (98);
std::cout << obj1.getA(); //outputs 98
}
要点をまとめると:
各オブジェクトは、独自のインスタンスメンバーにアクセスできます。1つのオブジェクトのインスタンスメンバーが他のオブジェクトに影響を与えることはありません(参照などの意図がない限り)。
両方のオブジェクトは同じ静的メンバープールを共有します。このプールは作成され、オブジェクトが作成される前に、Foo::
構文を使用して、または後に、obj1.
またはobj2.
構文を使用して操作できます。静的メンバーをどこかで変更すると、すべての場合に影響します。
これらのメンバーの使用を制御するには、メンバーをプライベートにし、アクセス機能を提供します。静的関数はインスタンスメンバーにアクセスできないことに注意してください。この関数はオブジェクトを作成せずに使用できるので、インスタンスメンバーで何をするのでしょうか。変更する特定のオブジェクトのインスタンスオブジェクトのプールはありません。
最後の点を詳しく説明すると、メンバー関数は暗黙のthis
引数を渡されます。これにより、変更するときに変更する変数が示されます。a = newA;
実際には。と同等this->a = newA;
です。ただし、静的メンバー関数は引数を取得しないため、this
変更するオブジェクトを知る方法はありません。