静态成员变量:

//静态成员变量(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;//chinavoid 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<<"\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,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 membercout<<"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

转载于:https://www.cnblogs.com/mylinux/p/4092415.html

c++,static 静态成员变量 / 静态成员函数相关推荐

  1. C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)

    1. this 指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址. this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象. 友元函数没有 thi ...

  2. c++静态成员变量成员函数

    c++面向对象模型初探 前言 静态成员变量 定义静态成员变量 使用静态成员变量 静态成员函数 概念 案例 疑难问题:静态成员函数中,不能使用普通变量. 前言 思考:每个变量,拥有属性.有没有一些属性, ...

  3. 静态成员函数与成员变量_C++静态成员变量及函数

    没有很快乐,也没有不快乐,好像不该这样,但也只能这样,成长也许如此,行于奔溃边缘又慢慢自愈吧... ----  网易云热评 一.静态成员变量 1.普通成员变量属于对象,每个对象都会包含一份独立的普通成 ...

  4. C++ 静态成员变量静态成员函数

    static修饰的就是静态的成员函数或者静态成员变量,管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享.也就是说所有的对象的该静态变量和函数都指向同一块内存区域. # ...

  5. 初识C语言之——static修饰变量及函数的认知。

    static--C语言中考题常见的关键字 在c语言中:static是用来修饰变量和函数. 我们可以先从字面意思来理解,即"静态的,静止的". 以至于它的修饰作用就有如下三个作用. ...

  6. c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回 ...

  7. C++静态成员函数与静态成员变量

    静态成员函数的作用 调用这个函数不会访问或者修改任何对象(非static)数据成员 不需要生成对象就能调用 原因: 类的静态成员(变量/方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去 ...

  8. C++ 静态成员变量和静态成员函数

    目录 静态成员变量 静态成员函数 测试代码 学习笔记 静态成员变量 要点 编译阶段分配内存 所有对象共享数据 通过对象,通过类名都可访问 静态成员变量如果通过类名访问不会调用构造函数,所以一般不在构造 ...

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

    C++静态成员函数不能调用非静态成员变量 静态成员函数 this指针 C++静态成员函数不能调用非静态成员变量原因 为什么要引入static 什么时候用static 致谢 静态成员函数 定义:静态成员 ...

最新文章

  1. 侯捷译Practical Java(含源码)
  2. vue插槽样式_vue 插槽简介及使用示例
  3. Spark on k8s: 通过hostPath设置SPARK_LOCAL_DIRS加速Shuffle
  4. openCV3学习笔记一,图像的加载,修改,保存
  5. 关于用批处理写ftp上传文件
  6. 【CCCC】L2-024 部落 (25分),,并查集,模板水题,统计集合个数
  7. implements Serializable有什么作用
  8. Android Studio 2.3.1导出jar文件不能生成release解决办法
  9. java几次,java兑现限制用户几次登录
  10. 分享一个手游脚本源码
  11. linux网卡驱动如何安装,linux下网卡驱动安装全过程
  12. svchost.exe 大量占用的问题
  13. Hexo-yilia主题个性化美化及功能添加
  14. mysql连接数怎么清理_MySQL连接数太多应该怎么解决?
  15. elasticsearch学习 part4
  16. STM32F0 、F1 在软件程序中写读保护选项字节(Option Bytes)
  17. 【泛函分析】平衡集和吸收集
  18. Xcode中的隐藏宝藏:模拟器里如何快速预览动态字体显示效果
  19. 什么是建筑中的“光储直柔”
  20. C语言实现windows窗口滑动条,四、Windows子窗口控件的滚动条类别—窗口子类别化(Window Subc...

热门文章

  1. pmp每日三题(2022年2月28日)
  2. MySQL中采用类型varchar(20)和varchar(255)对性能上的影响
  3. 美团在Redis上踩过的一些坑-2.bgrewriteaof问题
  4. CentOS7,linux下nginx的安装过程——1.安装pcre与nginx——源码
  5. 浏览器工作原理(四):浏览器事件解读
  6. scikit-learn 逻辑回归类库使用小结
  7. iOS NSNotificationCenter详解
  8. 2016021701 - 百位名人读书心法01
  9. position的高级使用
  10. PHP 文件创建/写入