[C ++]役割 - C ++キーワードの静的

静的な使い方

私は、繭の耳からこのキーワードのこと、誰もがそれを聞いたことがあるが、それでも、使用しないときに使用する際に知っていないと考えているが、これはインタビューは頻繁にして、私は他のと一緒になり、知識のポイントを聞いていますきちんともう一度、ブロガーを説明しました。

C ++の2つの方法で静的:静的およびオブジェクト指向プログラミングのプロセス指向のプログラミングは静的です。前者は主に一般の変数と関数のために使用されています。後者の役割は、主に静的クラスに使用されます。

まず、saticのプロセス指向設計

1.1静的グローバル変数

静的なグローバル変数として定義されるグローバル変数の前にあるキーワードを静的と

次のとおりです。

satic int n;  //定义静态全局变量

void Function()
{
	n++;
	cout << n << endl;
}
int main()
{
	n = 20;
	cout << n << endl;
	Function();
	return 0;
}

では、なぜ私たちは、静的の解消をintとして定義されたn個それを指示されませんか?実際には、これも真実である、プログラムがまだ実行されますが、静的なグローバル変数だけでなく、次のような利点として定義されます:

  • 静的なグローバル変数は、他のドキュメントで使用することはできません。
  • 他の変数は、同じファイル名ではなく、紛争に定義することができます

次のコードに示すように:

//文件1
#include <iostream>
#include <stdlib.h>
using namespace std;
static int n;  //定义静态全局变量
void fu();
int main()
{
	n = 20;
	cout << n << endl;
	system("pause");
	return 0;
}

//文件2
#include<iostream>
#include <stdlib.h>
using namespace std;

extern int n;  //定义相同名字的变量n

void fn()
{
	n++;
	cout << n << endl;
	system("pause");
}

我々は、単一のファイルを経由コンパイルされたときにも、これを見つけましたが、エラーを実行します。この時点で、これは我々が前に述べたものです:私たちは同じ静的グローバル変数の変数名を持つ別のファイルを定義することができますが、これは、静的なグローバル変数にはできませんファイル。

静的グローバル変数の特性:

  • 変数はメモリのグローバルデータ領域に割り当てられている;(メモリ割り当て、関数はグローバルデータエリアに終了し、スペースが解放されません)
  • (それが明示的に初期化されていない限り、自動確率変数の値)に初期化されていない静的なグローバル変数は、自動的に0に初期化されます。
  • そのファイル全体がファイルに加えて、表示されている文で静的グローバル変数は表示されません。

1.2スタティックローカル変数

次のコード:

void fn()
{
	static int n = 10;
	cout<<n<<endl;
	n++;
}

生体機能では、変数を定義するステートメントを実行するためのプログラムは、ローカル変数のスタックメモリに割り当てられている時はいつでも。しかし、プログラムは関数本体を出るときに、システムメモリのスタックを回復する、ローカル変数はそれに応じて無効。

ここでは、静的のより明白な効果は、最初の上記機能は、出力をfnを行う、はn = 10;第2のn = 11を実行するとき、2つのコール間の変数の静的な値として保存することができ、FN 。我々は変更されません、この定義ので、数多くのFNを実行している場合でも、nの値は10で、int型のn = 10を使用しないで、なぜここでそれを理解します。なぜ直接グローバル変数、プットint型のn = 10の書き込み直接外部関数として定義されていませんか?これが定義されている場合ので、その後、ここではこの変数は、関数自体の一部ではなく、プログラムのメンテナンス不便に、機能によって限定されるものではありません。

静的ローカル変数には次の特徴があります。

  • グローバル変数は、データ記憶領域に割り当てられています。
  • オブジェクトのステートメントに、プログラムの実行中に静的ローカル変数を最初に初期化されると、あること、関数呼び出しの後に初期化されません。
  • 通常の静的ローカル変数は、明示的な初期化が存在しない場合、プログラムは自動的にゼロに初期化されますが、初期化の中で宣言しました。
  • これは、プログラムの実行が終了するまで、グローバルデータ領域に常に存在です。それはスコープで終了ステートメントまたはファンクションブロックの最後に定義されているが、その範囲は、ローカルスコープです。

1.3静的関数

プラスファンクションの戻り値の型の前にstaticキーワードは、関数が静的関数として定義されています。別の静的な機能と正常な機能、それだけで見ることができ、そのファイルを宣言することができ、他のファイルで使用することはできません。

#include<iostream>
using namespace std;
 
static void fn();   //声明静态函数
 
int main(void)
{
	fn();
	return 0;
}
 
void fn()     //定义静态函数
{
	int n = 10;
	cout<<n<<endl;
}

静的関数は、利益を定義しました。

  • 静的関数は、他のファイルで使用することはできません。
  • その他の機能は、同じファイル名ではなく、紛争に定義することができます。

第二に、オブジェクト指向設計satic

2.1、静的データメンバ

クラスのデータメンバ内の文の前にキーワードを静的で、データのメンバーは、クラスの静的データメンバです。最初の静的データメンバの例を与えます

#include<iostream>
using namespace std;
 
class Myclass
{
private:
	int a , b , c;
	static int sum;  //声明静态数据成员
public:
	Myclass(int a , int b , int c);
	void GetSum();
};
 
int Myclass::sum = 0;   //定义并初始化静态数据成员

それの私の単純なポイント:

  • クラスでは、静的メンバーは、複数のオブジェクト間でデータを共有し、そして性を保証安全その隠された原則を破壊しないであろう、静的データメンバを使用することができます。したがって、静的オブジェクト・クラスのメンバーはすべてのメンバーがないオブジェクトのメンバとして、共有されています。複数のオブジェクトは、静的データメンバは、すべてのオブジェクトに対して1つの共通の格納されました
  • 静的データメンバは、グローバルデータ領域に格納されています。スペースを定義する場合、それはクラス宣言で定義されていない静的データメンバを割り当てるために、我々は、静的データメンバーの合計は、上記のコードでクラス外初期化されます

2.2静的メンバ関数

静的メンバ関数と静的データメンバは、クラスの静的メンバに属し、それらはすべて、彼らが対象のメンバーではありません。そのため、参照オブジェクト名は、静的メンバを使用する必要はありません。

次のように静的メンバ関数が定義されています。

#include<iostream>
using namespace std;
 
class Myclass
{
private:
	int a , b , c;
	static int sum;  //声明静态数据成员
public:
	Myclass(int a , int b , int c);
	static void GetSum();  //声明静态成员函数
};
 
int Myclass::sum = 0;   //定义并初始化静态数据成员
 
Myclass::Myclass(int a , int b , int c)
{
	this->a = a;
	this->b = b;
	this->c = c;
	sum += a+b+c;    //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum()    //静态成员函数的实现
{
	//cout<<a<<endl;    //错误代码,a是非静态数据成员
	cout<<"sum="<<sum<<endl;
}

それは、任意のオブジェクトに関連付けられていないので、それは、このポインタを持っていないため、通常、静的メンバ関数に比べ。この意味では、アクセス非静的データメンバは、クラスオブジェクトに属していないことができ、非静的メンバ関数のアクセス、それだけで静的メンバ関数の残りの部分を呼び出すことができますすることはできません

概要staticメンバ関数:

  • 間の静的メンバは、静的データメンバとメンバ関数静的アクセスにアクセスするための静的メンバ関数を含む、お互いにアクセスすることができます。
  • 任意の非静的メンバ関数は静的メンバ関数と静的データメンバにアクセスすることができます。
  • スタティックメンバ関数アクセス非静的メンバ関数と非静的データメンバはできません。
公開された33元の記事 ウォン称賛13 ビュー1016

おすすめ

転載: blog.csdn.net/Vicky_Cr/article/details/105234409