メンバー変数とメンバー関数
1 カテゴリー
メンバー変数とメンバー関数は、静的メンバーと非静的メンバーに分類されます。
違いと識別:
- Static キーワードで変更されたものは静的メンバーです。
- Static キーワードを変更しないと、非静的メンバーになります。
2つの違い
2.1 静的キーワード変更の有無
- Static キーワードで変更されたものは静的メンバーです。
- Static キーワードを変更しないと、非静的メンバーになります。
2.2 異なるメモリ割り当て時間
- 静的メンバーはメモリ内に存在し、非静的メンバーはメモリを割り当てる前にインスタンス化する必要があります。
2.3 さまざまなアクセス方法または呼び出し方法
- 静的メンバー。クラス名 + 静的メンバー名を使用して、この静的メンバーに直接アクセスできます。
- 静的メンバーはメモリ内に存在し、メモリを割り当てる前に非静的メンバーをインスタンス化する必要があるため、静的メンバーは非静的メンバーにアクセスできません。
- 非静的メンバーはクラスの静的メンバーに直接アクセスできます
静的メンバー: 静的クラスのメンバーは、静的修飾子を追加して静的メンバーになります。静的メンバーはメモリ内に存在し、非静的メンバーは事前にインスタンス化する必要があるため、クラス名 + 静的メンバー名を使用してこの静的メンバーに直接アクセスできます。メモリが割り当てられているため、静的メンバーは非静的メンバーにアクセスできません...静的メンバーはメモリ内に存在するため、非静的メンバーはクラス内の静的メンバーに直接アクセスできます静的メンバーのコピーは各クラスに 1 つだけあります。同じクラスの異なるオブジェクトに対する解決策の例。 間でのデータと関数の共有の問題。
非静的メンバー: 静的ではないすべてのメンバーは非静的メンバーです。クラスがインスタンス化されると、インスタンス化されたクラス名を介してアクセスできます。非静的メンバーの有効期間は、クラスの有効期間によって決まります。 ... そして静的メンバー 静的メンバーは常にコンテンツ内に存在するため、有効期間の概念はありません...
クラスには静的メンバーと非静的メンバーを含めることもでき、クラスには静的コンストラクターと非静的コンストラクターを含めることもできます。
静的メンバー関数は、クラスの静的データ メンバーおよび静的メンバー関数を直接参照できますが、非静的データ メンバーおよび非静的メンバー関数を直接参照することはできません。参照しないと、コンパイル エラーが報告されます。参照したい場合は、パラメーターの受け渡しを通じてオブジェクト名を取得し、オブジェクト名を通じてそれを参照する必要があります。
3つの例
class A
{
public:
static void f(A a);
private:
int x;
};
void A::f(A a)
{
cout<<x<<endl;//对x的引用是错误的
cout<<a.x<<endl;//正确的
}
#include<iostream>
using namespace std;
class Myclass
{
private:
int m; // 非静态数据成员
static int n; // 静态数据成员
public:
Myclass(); // 构造函数
static int getn(Myclass a); // 静态成员函数
};
Myclass::Myclass()
{
m = 10;
}
int Myclass::getn(Myclass a)
{
cout << a.m << endl; // 通过类间接使用 非静态数据成员
return n; // 直接使用 静态数据成员
}
int Myclass::n = 100; // 静态数据成员初始化
void main()
{
Myclass app1;
cout << app1.getn(app1) << endl; // 利用对象引用静态函数成员
cout << Myclass::getn(app1) << endl; // 利用类名引用静态函数成员
}
次に、静的メンバーと非静的メンバーの違いは次のように結論付けることができます。
1. アクセス方法が異なる 静的メンバー(クラス名.静的メンバー名でアクセス) 非静的メンバー(オブジェクト名.非静的メンバー名でアクセス)
2. 静的メンバーはクラスに属しており、クラスのすべてのオブジェクトがこのメンバーを共有します。
非静的メンバーはオブジェクトに属し、各オブジェクトにはコピーがあります。静的メンバーは、クラス内のオブジェクトの数に関係なく、メモリ内にスペースを割り当てるだけです。