静态成员变量:

//静态成员变量(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[] ;
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=)
{
strcpy(this->m_name , s);
this->m_age = age ;
this->m_country = country;
} //---------------------------------------------------------------
int Demo::m_country = ;//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" , , );
demo1.show(); Demo demo2("benben",);
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();
}
/*
country:112 //demo1.show();
country:111 //demo2.show(); name:benben //demo2.presence();
age:16
country:111
*/

C++中的类成员声明static:[1]

 在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

()类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。      

()不能将静态成员函数定义为虚函数。      

()由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

()由于静态成员函数没有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<<"\nfuncex,"<<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,,NULL); //在线程中使用taskThread结果 :in func , //另外,欲要在线程中使用类的方法,也可以使用友元函数。
//将友元函数用作线程函数,这里的话题与static方法无关了。
_beginthread(funcex,,NULL); // 在友元函数funcex中调用taskThread,再在线程中使用funcex结果 : funcex , in func, while();
return ;
}


#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, , ThreadCallback, (LPVOID)this, , NULL); //注意把THIS指针当做PARAM传进去,没这个我们就不用玩了
//ASSERT(m_hThread);
} CTest::~CTest()
{
if(m_hThread)
{
TerminateThread(m_hThread, );
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 ;
} int main()
{
CTest oTst;
while();
return ;
}

()static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。      

()静态数据成员在<定义或说明>时前面加关键字static。      

()静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)     

()静态成员初始化与一般数据成员初始化不同:

初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;
初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值> ()为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法: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

c++,static 静态成员变量 / 静态成员函数的更多相关文章

  1. c++——静态成员变量成员函数

    静态成员变量成员函数 思考:每个变量,拥有属性.有没有一些属性,归所有对象拥有? 4.1静态成员变量 1)定义静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象 ...

  2. C++ static 静态变量&静态成员函数

    .h文件中定义 static变量后,如 static QTcpSocket * socket; 那么一定要在.cpp中 构造函数的外面将其初始化为 QTcpSocket * Cfiletransfer ...

  3. c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)

    笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...

  4. static 关键字 静态成员变量及静态成员函数

    static类成员 类成员类似于C语言的全局变量,但是与全局变量又有所不同,例如,全局变量是可以被任何的用户代码所修改,而且全局变量破坏了对象的封装性. 使用类的 static 成员的优点 使用 st ...

  5. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

  6. C++静态成员函数不能调用非静态成员变量

    其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非 ...

  7. C++解析(14):静态成员变量与静态成员函数

    0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...

  8. c++ 静态成员变量

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  9. JAVA非静态成员变量之死循环

    1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...

随机推荐

  1. BZOJ 1497: [NOI2006]最大获利( 最大流 )

    下午到周六早上是期末考试...但是我还是坚守在机房....要挂的节奏啊.... 这道题就是网络流 , 建图后就最大流跑啊跑啊跑... --------------------------------- ...

  2. Python BeautifulSoup中文乱码问题的2种解决方法

    解决方法一: 使用python的BeautifulSoup来抓取网页然后输出网页标题,但是输出的总是乱码,找了好久找到解决办法,下面分享给大家首先是代码 from bs4 import Beautif ...

  3. python 10 min系列三之小爬虫(一)

    python10min系列之小爬虫 前一篇可视化大家表示有点难,写点简单的把,比如命令行里看论坛的十大,大家也可以扩展为抓博客园的首页文章 本文原创,同步发布在我的github上 据说去github右 ...

  4. Git merge local repository

    I've met this problem for so many times and let me write a blog for solving this problem. First, you ...

  5. 射频识别技术漫谈(18)——Mifare Desfire

    Mifare  DESFire(MF3 IC D40/D41,本文以D40为例)遵守14443 TypeA协议,卡内的数据以文件形式存储,所以有人认为它是准CPU卡,主要用于安全性要求较高的非接触式领 ...

  6. Android Studio 新建项目的R文件丢失的解决方法

    最近Android Studio炒的比较热,于是笔者决定赶赶时髦,从Eclipse转到了Android Studio.不幸的是,用Android Studio创建项目的时候就遇到了一个比较尖锐的问题— ...

  7. png的格式及像素存储分析

    从图片的数据块存储方式来看png分两种 1.索引色模式存储.png8的索引色透明就采取该种方式.该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte).而图片的数据 ...

  8. Libev学习笔记1

    和Libevent相似,Libev是一个高性事件驱动框架,据说性能比Libevent要高,bug比Libevent要少.Libev只是一个事件驱动框架,不是网络库,因为它的内部并没有任何socket编 ...

  9. 84. 从视图索引说Notes数据库(下)

    作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...

  10. 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。

    使用Eclipse依赖生成jar包时,如果做配置,生成的jar包文件会全部生成在外面,这并不是我们需要的,下面我们一起来修改下配置,使生成的jar包符合我们的需求吧. 1.如果不做任何配置生成的jar ...