staticキーワードの役割:
c / c ++には次のものがあります。
1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
3):修饰函数时,表明该函数只在同一文件中调用。
C ++固有:
4):修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
5):用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量
静的ローカル変数の特徴:
(1)変数はグローバルデータ領域にメモリを割り当てます(ローカル変数はスタック領域にメモリを割り当てます)
(2)静的ローカル変数は、プログラムが実行されたときに初めて初期化されます。オブジェクト、つまり後続の関数呼び出し初期化は不要
(ローカル変数は関数が呼び出されるたび
に初期化されます)(3)静的ローカル変数は通常、宣言場所で初期化されます。初期化が表示されない場合は、自動的に初期化されます。プログラムによって0に設定され
ます(ローカル変数は初期化されません)
(4)プログラムが終了するまで、常にグローバルデータ領域に存在します。ただし、そのスコープはローカルスコープです。つまり、関数の外部で使用することはできません
(ローカル変数はスタック領域にあり、メモリは関数の終了直後に解放されます)。
静的グローバル変数の機能:
(1)静的グローバル変数を他のファイルで使用することはできません(グローバル変数は問題ありません)
(2)同じ名前の変数を他のファイルで競合することなく定義することもできます(静的分離ファイル、および他のファイルは同じ名前の変数はそれとは何の関係もありません)
静的関数の機能:
(1)静的関数は他のファイルでは使用できません
(2)他のファイルは競合することなく同じ名前の関数を定義できます
静的メンバー関数の機能:
(1)静的メンバー関数は静的データメンバーおよび静的メンバー関数にアクセスするための静的メンバー関数を含め、相互にアクセスできます
(2)非静的メンバー関数は静的メンバー関数および静的データメンバーに任意にアクセスできます
(3)静的メンバー関数は、非静的メンバー関数および非静的データメンバーには使用できません。
(4)静的メンバー関数を呼び出すには、メンバーアクセス演算子(。)および(->)を使用して、クラスオブジェクトの静的メンバーを呼び出すことができます。クラスオブジェクトFunctionへのポインタ。
クラス名::関数名を使用して呼び出すこともできます。
非静的データメンバー関数の場合、各オブジェクト(インスタンス)には独自のコピーがあります。
静的データメンバーは、クラスのメンバーとして扱われ、タイプのすべてのオブジェクトによって共有アクセスされます。クラスの複数のオブジェクトの場合、静的データメンバーは1回だけ割り当てられます。
静的データメンバーは、グローバルデータ領域に格納されます。静的データメンバーは、定義時にメモリを割り当てる必要があるため、クラス宣言で定義することはできません。
constキーワードの役割
1)変数が変更されないようにするには、constを使用できます。const変数を定義するときは、最初に変数を初期化する必要があり、後で変更することはできません。
2)ポインターの場合、ポインター自体をconstとして指定するか、ポインターが指すデータをconstとして指定するか、または両方をconstとして指定することができます。
3)関数宣言では、constは仮パラメーターを変更して、それが入力パラメーターであることを示すことができ、その値を関数内で変更することはできません。
4)クラスのメンバー関数の場合、定数型であり、クラスのメンバー変数を変更できないことを示すconst型として指定する必要がある場合があります。
5)クラスのメンバー関数の場合、戻り値が「左辺値」にならないように、const型の戻り値を指定する必要がある場合があります。
const変更変数
(1)変数の値は変更できません
constはポインタを変更します
(1)constが左側にある場合、constはポインタが指す変数を変更するために使用されます。つまり
、constが右側にある場合、ポインタは定数(2)を指します。ポインタ自体を変更します。つまり、ポインタ自体は一定です。
指针常量:不能通过指针来修改变量的值。
常量指针:一直指向该变量,不能给该指针赋予其他地址
関数でconstを使用します
(1)constは
、パラメーターが不変であることを示すために関数パラメーターを変更します
-
パラメータが参照の場合、効率を上げることができます
-
const参照の受け渡しと関数の値による受け渡しの効果は同じですが、値による受け渡しは、最初にクラスオブジェクトのコピーを作成し、次にそれを渡し、アドレスを直接渡すため、この転送は渡すよりも効果的です。値で
-
constが値で渡される場合、それは外部オブジェクトの単なるコピーです。値の変更は外部に影響を与えないので、意味がありません。間違っています。重要な目的は、この変数が許可されていないことを伝えることです。変更すると、参照渡しの効率が高くなります。それだけです。
(2)const変更関数の戻り値の
意味は、const変更変数およびポインターの意味と同じです。
クラスでのconstの使用
(1)const変更されたメンバー変数
-
メンバー変数を変更できず、初期化リストでのみ割り当てることができることを示します
(2)const変更されたメンバー関数 -
関数はオブジェクトのメンバー変数を変更できません
-
非constメンバー関数はメンバー変数を変更しようとするため、非constメンバー関数を呼び出すことはできません。
-
constメンバー関数は、constクラスオブジェクトから呼び出すことができます。つまり、constクラスオブジェクトはconstメンバー関数のみを呼び出すことができます
-
staticキーワードはstaticメンバー関数を変更するため、constキーワードをstaticキーワードと同時に使用することはできません。staticメンバー関数にはthisポインターが含まれていないため、インスタンス化できません。constメンバー関数は次のようにする必要があります。インスタンスに固有です。
const変更クラスオブジェクトの
メンバーは変更できません。
呼び出すことができるのはconstメンバー関数のみです。
質問:クラス内のすべての関数をconst関数として宣言できますか?どの機能ができないのですか?
(1)コンストラクターは次のことはできません。
-
const変更関数は、関数の戻り値がconst型であり、戻り値は同じ型のconst変数にのみ割り当てることができることを意味します。
-
constはクラスを変更できるメンバー関数ですが、関数はデータメンバーを変更できません。コンストラクターもクラスのメンバー関数に属していますが、コンストラクターはクラスのメンバー変数を変更するため、クラスのコンストラクターをconst型として宣言することはできません。
(2)静的メンバー関数が機能しない
静的静的メンバーは、特定のオブジェクトではなくクラスに属し、すべてのオブジェクトが静的メンバーを共有します。thisポインターは特定のオブジェクトのアドレスであるため、静的メンバー関数にはこのポインターがありません。関数内のconstは、実際にはthisポインターを変更するために使用されます。つまり、これが指すコンテンツは不変であるため、constを使用して静的メンバー関数を変更することはできません。