Cから見たC+の(七)static
3968 ワード
C言語におけるキーワードstaticの主な役割は、役割ドメインとライフサイクルの2つである.例えば、1つの関数をstaticと宣言すると、その役割ドメインが現在のテキストに有効であることを制限することができます.1つの関数内部の変数をstaticと宣言すると、そのライフサイクルは関数呼び出しの終了によって終了するのではなく、メモリの静的領域に1つのメモリ空間を占めている.
一方、C++におけるキーワードstaticは、修飾上はCと区別する、メンバー変数や関数を修飾するために用いられる.
修飾クラスメンバー変数:
一般に、同一クラスの異なるオブジェクトは、その各メンバデータが独立する.しかしクラスメンバーデータがstaticによって修飾されると、そのメンバーデータはクラスによって定義されたすべてのオブジェクトが共有する.
クラスの静的変数を初期化する必要がある場合、クラス外で一度だけ定義的な説明を行うべきである.次のようになります.
[注:]
修飾クラスメンバー関数:
クラスのメンバー関数にキーワードstaticを付ける静的メンバー関数として定義.
クラスメンバー関数をstaticで修飾する場合は、次の点に注意してください.
静的メンバー関数へのアクセス方法:
静的メンバー関数の例を次に示します.
ソース:
一方、C++におけるキーワードstaticは、修飾上はCと区別する、メンバー変数や関数を修飾するために用いられる.
修飾クラスメンバー変数:
一般に、同一クラスの異なるオブジェクトは、その各メンバデータが独立する.しかしクラスメンバーデータがstaticによって修飾されると、そのメンバーデータはクラスによって定義されたすべてのオブジェクトが共有する.
クラスの静的変数を初期化する必要がある場合、クラス外で一度だけ定義的な説明を行うべきである.次のようになります.
int baseClass::count = 100;
のコード例は次のとおりです.#include <iostream>
using namespace std;
class baseClass
{
private:
static int count;
unsigned int age;
bool sex;
public:
baseClass(unsigned int a,bool s,int c)
{
age = a;
sex = s;
count = c;
}
~baseClass()
{
std::cout << "~Base Class"<< std::endl;
}
unsigned int baseGetAge(void);
bool baseGetSex(void);
int baseGetCount(void);
};
unsigned int baseClass::baseGetAge(void)
{
return age;
}
bool baseClass::baseGetSex(void)
{
return sex;
}
int baseClass::baseGetCount(void)
{
return count;
}
int baseClass::count = 100;
int main(void)
{
baseClass clsBase0(18,0,50);
std::cout << clsBase0.baseGetAge() << std::endl;
std::cout << clsBase0.baseGetSex() << std::endl;
std::cout << clsBase0.baseGetCount() << std::endl;
baseClass clsBase1(24,1,77);
std::cout << clsBase1.baseGetAge() << std::endl;
std::cout << clsBase1.baseGetSex() << std::endl;
std::cout << clsBase1.baseGetCount() << std::endl;
std::cout << clsBase0.baseGetAge() << std::endl;
std::cout << clsBase0.baseGetSex() << std::endl;
std::cout << clsBase0.baseGetCount() << std::endl;
return 0;
}
コンパイル実行:root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# g++ static.cpp -o static
root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# ./static
18
0
50
24
1
77
18
0
77
~Base Class
~Base Class
から分かるように、変数age、sexは同一クラスの異なるオブジェクトが互いに独立しており、静的データメンバーは同一クラスの異なるオブジェクト間で共有する.したがって、静的メンバデータにより、同一クラスの異なるオブジェクト間でリソースの共有または通信を実現することができる.例えば、クラスの参照カウント.[注:]
, , , ,
.
修飾クラスメンバー関数:
クラスのメンバー関数にキーワードstaticを付ける静的メンバー関数として定義.
クラスメンバー関数をstaticで修飾する場合は、次の点に注意してください.
1. , ( ). , ,
this ;
2. , static.
静的メンバー関数へのアクセス方法:
, , .
静的メンバー関数の例を次に示します.
ソース:
#include <iostream>
using namespace std;
class baseClass
{
private:
static int count;
unsigned int age;
bool sex;
public:
baseClass(unsigned int a,bool s,int c)
{
age = a;
sex = s;
count = c;
}
~baseClass()
{
;
}
unsigned int baseGetAge(void);
bool baseGetSex(void);
int baseGetCount(void);
static void baseGetInfo(baseClass c);
};
unsigned int baseClass::baseGetAge(void)
{
return age;
}
bool baseClass::baseGetSex(void)
{
return sex;
}
int baseClass::baseGetCount(void)
{
return count;
}
void baseClass::baseGetInfo(baseClass c) //No static
{
std::cout << c.age<< std::endl;
std::cout << c.sex<< std::endl;
std::cout << count<< std::endl;
}
int baseClass::count = 100;
int main(void)
{
baseClass clsBase0(18,0,50);
baseClass clsBase1(24,1,77);
baseClass::baseGetInfo(clsBase0);
baseClass::baseGetInfo(clsBase1);
return 0;
}
コンパイル実行:root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# g++ staticFunc.cpp -o staticFunc
root@se7en-LIFEBOOK-LH531:~/learn/Cpp_Program# ./staticFunc
18
0
77
24
1
77
に関する知識点は次のとおりです.1. ;
2. ;
3. ;
4. .