class
C/C++内または C/C++ で変数を宣言するときは、変数struct
のオブジェクトを作成するclass
かstruct
、変数にメモリを割り当てる必要があります。
オブジェクトなしでこれらの変数にアクセスできないのはなぜですか?
ええと、答えは本当に: それがこの言語機能の要点だからです。クラスのデータ メンバーのまさにその概念は、それがクラス オブジェクトの不可欠な部分になることです。それは、クラス オブジェクト全体とともにその寿命を開始し、同時にその寿命を終えます。
2 つのクラス オブジェクトがある場合、2 つの完全に独立したデータ メンバーのセットがあります。50 個のクラス オブジェクトがある場合、50 個の完全に独立したデータ メンバーのセットがあります。クラス オブジェクトがない場合は、アクセスするデータ メンバーのセットがありません。つまり、これらの「変数」は、クラス オブジェクトなしでは存在しないという理由だけで、クラス オブジェクトなしではアクセスできません。
クラス定義でクラスのデータメンバーを宣言するとき、実際には「変数を宣言」していません。クラス定義は、単にクラス型のレイアウトを記述します。それ自体では、物理的なものは何も生成されません。つまり、データメモリに存在することに注意し、物理的にアクセスできることに注意してください。
一方、C++ 言語には、クラスの静的メンバーという概念があります。クラスの静的データ メンバーは、特定のクラス オブジェクトに関連付けられていません。それらは独立して存在します。実際、静的データ メンバーは、C++ 固有の「シンタックス シュガー」 (より精巧な命名、アクセス制御など) のかなり薄いレイヤーでカバーされた通常のグローバル変数にすぎません。クラスの静的データ メンバーは、通常の変数としてアクセスできます。物体。
つまり、「なぜ?」という問題ではありません。むしろ、何が必要かという問題です。非静的データ メンバー機能が必要な場合は、非静的データ メンバーを使用します。静的データ メンバーの機能が必要な場合は...まあ、アイデアは得られます。
クラスは、インスタンス化されたオブジェクトがどのように構築、破棄され、どのように動作するかを指定するために使用される単なる「レイアウト」です。建物との画像比較の場合:クラスは、家を建てるために使用される計画です。オブジェクトは家そのものです。
オブジェクトのない変数が必要な場合は、グローバル変数を使用してください。それらを名前空間に入れることができます:
namespace test
{
int answer = 42; // Initialization is optional
}
// ...
void f()
{
// Use it like this:
test::answer = 0;
}
静的メンバーを使用することもできます。
class MyClass
{
public:
static int value;
};
通常、メンバー変数をクラス内で宣言するのは、それをそのクラス型のオブジェクトの一部にしたいからです。それがその言語機能の目的です。それぞれが他のオブジェクトから独立した独自の状態を持つ、多くの異なるオブジェクトを持つことができるようにするためです。
C++ (ただし C ではありません) ではstatic
、単一の変数が必要な場合は、オブジェクトから独立して宣言できます。これには、クラス外で宣言された変数と同様に、静的な保存期間があります。C では、このようなものが必要な場合、グローバル変数が唯一のオプションです。
例えば:
struct thing {
int a; // part of a "thing" object
static int b; // not part of a "thing"
};
// Static variables need a definition, in exactly one source file
int thing::b;
int main() {
thing::b = 1; // OK: no object needed
thing::a = 2; // ERROR: object needed
thing t1;
t1.a = 3; // OK: accessing object member
t1.b = 4; // OK: equivalent to "thing::b"
thing t2;
t2.a = 5; // OK: accessing object member
t2.b = 6; // OK: equivalent to "thing::b"
std::cout << t1.a; // prints 3
std::cout << t2.a; // prints 5 - independent of t1.a
std::cout << t1.b; // prints 6
std::cout << t2.b; // prints 6 - same variable as t1.b (aka thing::b)
}
static キーワードの使用:
class A {
public:
static int varaible;
};
int A::variable = 5;
その後、いつでもオブジェクトなしで変数にアクセスできます。次のように。
A::varaible = 25;
知っておくべきこと:
int A::variable = 5;
は、静的メンバーの定義です。A
(継承されたオブジェクトを含む) は、静的メンバーを共有します。[1][1]
A a;
A b;
a::variable == b::variable == 25;
//if we change a::variable
a::variable = 26;
//b::variable has the same value.
b::variable == a::variable == 26;