c ++の研究ノート13-データの範囲と存続期間

データスコープはデータの有効な領域です
。データスコープには、次の
関数スコープが含まれます。
単純なものは関数の正式なパラメータです宣言内の関数のスコープは、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 ++なので、直接表示することはできません。静的関数を使用して解決できます。
静的関数非静的関数の場合、どのオブジェクトが呼び出されたかはわかりますが、静的メンバー関数はどのオブジェクトが呼び出されたかを認識しないため、静的関数メンバーを処理できます。

興味のある読者は試してみることができます。非静的関数を呼び出して、関連する問題を処理します。

おすすめ

転載: blog.csdn.net/qq_41803340/article/details/112724468