c++,static静的メンバー変数/静的メンバー関数

20019 ワード

静的メンバー変数:
//      (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