データスコープはデータの有効な領域です
。データスコープには、次の
関数スコープが含まれます。
単純なものは関数の正式なパラメータです。宣言内の関数のスコープは、Have theなどの括弧のスコープに制限されます。次のコード
void show(int x);
宣言内のxのスコープは角かっこ内に制限されています。コンパイラーはパラメーターの名前ではなくパラメーターの型のみをチェックするため、宣言内で名前を定義することはできませんが、便宜上名前を定義することをお勧めします。読書の。
ローカルスコープ:
関数パラメーターから関数本体の終わりまでの関数パラメーターリストのスコープ関数本体で宣言された変数のスコープは、宣言から始まり、ブロックの終わりにある中括弧で終わります。宣言があります。いわゆるAブロックは、中括弧で囲まれたプログラムのセクションです。具体的な概略図を次の図に示し
ます。図から各機能の範囲を確認できます。
クラススコープ:
クラスは名前付きメンバーのセットと見なすことができます。クラスのメンバーがパブリック属性の場合、
オブジェクト名とメンバー名を使用してクラスのデータメンバーにアクセスするか、ptrを介してアクセスできます。 ->メンバー名。ptrはクラスへのポインタです。または、クラス名::オブジェクトを介してアクセスできます。要約すると、XyまたはX :: yの2つの方法でアクセスできます。
名前空間スコープ:
プログラムは多くのモジュールで構成されており、各モジュールの名前は同じ名前である可能性が高く、あいまいさを引き起こす可能性があるため、名前空間の役割は同じ名前のあいまいさを防ぐことです。そのため、名前空間を使用します。同じことによって引き起こされる名前の曖昧さを防ぐ方法。C ++ jでは
名前空間stdを使用した文がよく見られます。この文は、std名前空間が使用されていることを意味します。この文が追加されていない場合は、関数を使用するときに
上記のstd ::を追加する必要があります。3つのスコープが導入されました。データ、つまり関数スコープ、ローカルスコープ、クラススコープ、名前空間スコープ、以下では識別子の可視性について説明します。**最初に、次の図に示すように識別子の可視性を観察します
。ルールは、内部スペースと宇宙空間は同じ変数名を持たず、宇宙空間の変数は内部空間でアクセスできますが、内部空間と宇宙空間が同じ変数名を持っている場合、宇宙空間変数はシールドされます、これらのルールは少し複雑かもしれないので、空間スコープの関係を説明するために例を挙げましょう。
具体的なサンプルコードは次のとおりです
# include <iostream>
namespace global {
int i; //在命名空间global 中定义全局变量 i
}
int j; //定义全局变量j
int main()
{
global::i = 2;//将全局变量=2
j = 3;
//块作用域
{
//定义与全局作用域相同名字的变量测试是否会屏蔽
int i = 4;
std::cout << "i =" << i << std::endl;
//输出j变量
std::cout << "j =" << j << std::endl;
}
}
操作の結果は次のとおりです;
(名前空間を持つ変数はグローバルスコープを持っていることに注意してください)
以下に、データの有効期間について説明します。オブジェクトの
静的有効期間の有効期間は、
プログラムランタイムと同じです。静的有効期間があると言われます。関数内で静的有効期間を持つオブジェクトを宣言する場合は、キーワードstaticを使用する必要があります。オブジェクトの静的有効期間後、オブジェクトはコピーされず、関数の戻りで無効化されません。つまり、関数がオブジェクトを返すと、値は次のようになります。次の値が呼び出されたときにも保存されます。value。
動的存続期間:
オブジェクトは宣言の時点で生まれ、実行されるブロックが完了すると終了します。
静的関数メンバーの例を次に示し
ます。クラスを作成し、コンストラクター関数とコピー関数が呼び出されるたびにカウントします。
# include<iostream>
using namespace std;
class point
{
private:
int x;
int y;//非静态成员
static int count;//静态数据成员的声明在类内,定义以及初始化要放在类外
public:
point(int x, int y) :x(x), y(y) {
cout << "calling construction " << endl; count++; }
int getx() {
return x; }
int gety() {
return y; }
void show() {
cout << "count is " << count << endl; }
//static void show() { cout << "count is " << count << endl; }
point(point &s) {
x = s.x;
y = s.y;
count++;
}
~point() {
count--; }
};
int point::count = 0;//类外初始化定义
int main()
{
point a(1, 2);
a.show();
point b(a);
b.show();//count =2,因为前面已经构造了a,所以count=2
}
実行結果は次のとおりです。
静的データメンバーの有効期間はプログラムの実行時間と同じであるため、2番目のカウントの出力は2になります。次に問題があります。クラスがない場合は、現在のカウント値を確認してください。0である必要がありますが、カウントはプライベートメンバーであるため、オブジェクト名とメンバー名を介してのみアクセスできます。オブジェクトが定義されると、 count ++なので、直接表示することはできません。静的関数を使用して解決できます。
静的関数非静的関数の場合、どのオブジェクトが呼び出されたかはわかりますが、静的メンバー関数はどのオブジェクトが呼び出されたかを認識しないため、静的関数メンバーを処理できます。
興味のある読者は試してみることができます。非静的関数を呼び出して、関連する問題を処理します。