c++,static静的メンバー変数/静的メンバー関数
20019 ワード
静的メンバー変数:
静的メンバー関数:
C++のクラスメンバー宣言static:[1]
// (static)
//
//1. ,
// , static , static int a;
// ,
// 。
//
//2. 。
//
//3. 。
// : ∷ =
// : int Stu :: a = 20;
//
//4. :
//
//(1) , 、
// 。
//
//(2) ,
// “ :: ”。
静的メンバー関数:
//1、
// (1) , 、
// (2) , :: 。
//2、 "this.", " ::" "this.";
//(1) static 。
//(2)static :: 。
#include <iostream>
using namespace std ;
#include <string>
//---------------------------------------------------------------
class Demo{//
public:
int m_age ;
char m_name[10] ;
static int m_country;
Demo(char* s , int age,int country);//
static void show(void); //
void presence(void); //
};
Demo::Demo(char* s ,int age ,int country=111)
{
strcpy(this->m_name , s);
this->m_age = age ;
this->m_country = country;
}
//---------------------------------------------------------------
int Demo::m_country = 111;//china
void Demo::show()
{
//cout<<"name:"<<m_name<<endl;//error C2597: “Demo::m_name”
//cout<<"age:"<<m_age<<endl;//error C2597: “Demo::m_age”
//cout<<"country:"<<this->m_country<<endl;//error C2355: “this”:
//cout<<"country:"<<m_country<<endl;//ok
cout<<"country:"<<Demo::m_country<<endl;//ok ::
}
void Demo::presence()
{
cout<<"name:"<<m_name<<endl;
cout<<"age:"<<m_age<<endl;
cout<<"country:"<<m_country<<endl;//ok
//cout<<"country:"<<this->m_country<<endl;//ok
//cout<<"country:"<<Demo::m_country<<endl;//ok
}
//----------------------------------------------------------------
int main()
{
Demo demo1("caicai" , 18 , 112);
demo1.show();
Demo demo2("benben",16);
demo2.show();
demo2.presence();
//Demo::m_country 【 、 】, demo1、demo2 。
// main Demo::m_country。
cout<<" Demo::m_country="<<Demo::m_country<<endl;
cout<<" demo1.m_country="<<demo1.m_country<<endl;
cout<<" demo2.m_country="<<demo2.m_country<<endl;
while(1);
}
/*
country:112 //demo1.show();
country:111 //demo2.show();
name:benben //demo2.presence();
age:16
country:111
*/
C++のクラスメンバー宣言static:[1]
static , , , , , :
(1) , this , 。
(2) 。
(3) , , , , , “nonmember ”。
(4) this , nonmember , : callback , C++ C-based X Window , 。[2] [3]
#include <iostream>// [2]
using namespace std;
#include "windows.h"
#include <process.h>
class ExampleTask
{
public:
static void taskThread(LPVOID param);
friend void funcex(LPVOID param);
void func()
{
cout<<"in func,"<<endl;
}
};
void funcex(LPVOID param)
{
cout<<"
funcex,"<<endl;
ExampleTask *pOeg = (ExampleTask*) param ;
pOeg->func();
}
void ExampleTask::taskThread(LPVOID param)
{
ExampleTask *pOeg = (ExampleTask*) param ;
pOeg->func();
}
int main(int argc, char* argv[])
{
ExampleTask realTimeTask;
// , 。
// c++ , 。
realTimeTask.taskThread(&realTimeTask);// taskThread : in func,
// , ? : 。
// ,C++ 。 , this 。
//
_beginthread(ExampleTask::taskThread,0,NULL); // taskThread :in func ,
// , , 。
// , static 。
_beginthread(funcex,0,NULL); // funcex taskThread, funcex : funcex , in func,
while(1);
return 0;
}
#include <iostream> //[3] using namespace std; #include "windows.h" #include <process.h> class CTest { public: CTest(); ~CTest(); static DWORD WINAPI ThreadCallback(PVOID pParam); // , STATIC DWORD MyProc(); private: HANDLE m_hThread; }; CTest::CTest() :m_hThread(NULL) { m_hThread = CreateThread(NULL, 0, ThreadCallback, (LPVOID)this, 0, NULL); // THIS PARAM , //ASSERT(m_hThread); } CTest::~CTest() { if(m_hThread) { TerminateThread(m_hThread, 1); m_hThread = NULL; } } DWORD WINAPI CTest::ThreadCallback(PVOID pParam)//Callback ThreadCallback(CTest* pCTest), (PVOID pParam)。 { return ((CTest*)pParam)->MyProc(); // pParam , } DWORD CTest::MyProc() // , { //do whatever you want //even visit the private member cout<<"MyProc"<<endl; return 0 ; } int main() { CTest oTst;
while(1); return 0 ; }(5)static , , 。 (6) < > static。 (7) , 。 ( , , Link ) (8) : , static, ; private,public ; ; : < >< >::< >=< > (9) , , 。 : , , ? , :name-mangling 。
参照先:
1 . C/C++におけるstaticキーワードの役割のまとめ
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/19/2598815.html
2.スレッド関数としてクラスメンバー関数
http://blog.163.com/lyz_sea/blog/static/115586707201101025443711/
3.静的メンバー関数CALLBACK関数とスレッド関数に適用
http://www.cnblogs.com/kanego/articles/2268723.html