没有很快乐,也没有不快乐,好像不该这样,但也只能这样,成长也许如此,行于奔溃边缘又慢慢自愈吧。。。

----  网易云热评

一、静态成员变量

1、普通成员变量属于对象,每个对象都会包含一份独立的普通成员变量;而静态成员变量不属于对象,一个类中静态成员变量只有一份

2、静态成员变量不能在构造函数中定义和初始化,需要在类的外部单独的定义和初始化。

3、静态成员变量和全局变量类似,被放在数据段,可以把静态成员变量理解为被限制在类中使用的全局变量.

4、访问静态成员变量方法:

类名::静态成员变量;//推荐

对象.静态成员变量;//本质和上面一样

#include using namespace std;class A{public:    //普通成员变量在构造定义和初始化    A(int data):m_data(data){}    int m_data;//普通成员变量    static int s_data;//静态成员变量};//静态成员变量需要在类的外部单独定义和初始化int A::s_data = 20;int main(void){    A a(10);    cout << "sizeof(a)=" << sizeof(a) << endl;    //普通成员变量必须通过对象访问    cout << a.m_data << endl;//10    //静态成员变量可以通过"类名::"访问    cout << A::s_data << endl;//20    cout << a.s_data << endl;//ok,20    A a2(10);    a2.m_data = 100;    a2.s_data = 100;    cout << a.m_data << endl;//10    cout << a.s_data << endl;//100    return 0;}

二、静态成员函数

1、静态成员函数中没有this,也没有const属性,可以把静态成员函数理解为被限制在类中使用的全局函数

2、使用方法:

类名::静态成员函数(实参表);//推荐

对象.静态成员函数(实参表);//本质和上面等价

3、在静态成员函数中只能访问静态成员,在非静态成员函数中既可以访问静态成员,也可以访问非静态成员

#include using namespace std;class A{public:    //普通成员变量在构造定义和初始化    A(int data):m_data(data){}        static void func1(void){        cout << "静态成员函数" << endl;        //cout << m_data << endl;        cout << s_data << endl;    }    void func2(void){        cout << "非静态成员函数" << endl;        cout << m_data << endl;        cout << s_data << endl;    }    int m_data;//普通成员变量    static int s_data;//静态成员变量};//静态成员变量需要在类的外部单独定义和初始化int A::s_data = 20;int main(void){    A::func1();    A a(10);    a.func2();    return 0;}

三、单例模式

一个类只允许创建唯一的对象,并提供它的访问方法.

//单例模式:饿汉式

#include using namespace std;class Singleton{public:    //3)使用静态成员函数获取单例对象    static Singleton& getInstance(void){        return s_instance;    }    void print(void)const{        cout << m_data << endl;    }private:    //1)私有化构造函数    Singleton(int data=0):m_data(data){        cout << "单例对象被创建了" << endl;      }    //将拷贝构造也声明为私有    Singleton(const Singleton& that);private:    int m_data;    //2)使用静态成员变量表示单例对象    static Singleton s_instance;};Singleton Singleton::s_instance = 1234;int main(void){    cout << "main函数开始执行" << endl;    //Singleton s(123);//error    //Singleton* ps = new Singleton(123);    Singleton& s1=Singleton::getInstance();    Singleton& s2=Singleton::getInstance();    Singleton& s3=Singleton::getInstance();        cout << "&s1=" << &s1 << endl;    cout << "&s2=" << &s2 << endl;    cout << "&s3=" << &s3 << endl;    s1.print();//1234    s2.print();//1234    s3.print();//1234    return 0;}
//单例模式:懒汉式#include using namespace std;class Singleton{public:    //3)使用静态成员函数获取单例对象    static Singleton& getInstance(void){        if(s_instance == NULL){            s_instance = new Singleton(1234);        }        ++s_count;        return *s_instance;    }    //单例对象不用即销毁,具体时机?    //最后一个使用者调用release再销毁!    void release(void){        if(--s_count == 0){            delete s_instance;            s_instance = NULL;        }    }    void print(void)const{        cout << m_data << endl;    }private:    //1)私有化构造函数    Singleton(int data=0):m_data(data){        cout << "单例对象被创建了" << endl;      }    //将拷贝构造也声明为私有    Singleton(const Singleton& that);    ~Singleton(void){        cout << "单例对象被销毁了" << endl;    }private:    int m_data;    //2)使用静态成员变量表示单例对象    static Singleton* s_instance;    //计数:记录单例对象使用者的个数    static int s_count;};Singleton* Singleton::s_instance = NULL;int Singleton::s_count = 0;int main(void){    cout << "main函数开始执行" << endl;    //Singleton s(123);//error    //Singleton* ps = new Singleton(123);    //++s_count ==> 1    Singleton& s1=Singleton::getInstance();    //++s_count ==> 2    Singleton& s2=Singleton::getInstance();    //++s_count ==> 3    Singleton& s3=Singleton::getInstance();        cout << "&s1=" << &s1 << endl;    cout << "&s2=" << &s2 << endl;    cout << "&s3=" << &s3 << endl;    s1.print();//1234    s1.release();//--s_count:2        s2.print();//1234    s3.print();//1234    s2.release();//--s_count:1    s3.release();//--s_count:0,delete    return 0;}

欢迎关注公众号:顺便编点程

静态成员函数与成员变量_C++静态成员变量及函数相关推荐

  1. python函数封装的好处_C++用类封装函数有什么好处么?

    myListSort这种用法称为"函数对象"或"仿函数".从名称可以看出来,myListSort是一个类(或结构),而非函数,但是它的使用方法又颇似函数,即可以 ...

  2. c c++ 函数内数组初值_C编程基础-关键字-函数和指针

    C术语的基本定义,例如关键字,标识符,运算符,指针,数据类型,void main(),函数和递归. 在大多数情况下,我们突然无法回答一些简单的问题,例如C中的关键字是什么,C中的标识符是什么,C中的数 ...

  3. 单片机sleep函数的头文件_C语言之Sleep函数

    Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include ,在Linux下,gcc编译 ...

  4. 单片机sleep函数的头文件_c语言的 sleep函数到底在哪个头文件里啊

    展开全部 在里面. 在VC中使用时,sleep函数的头文件为windows.h,在Linux下,gcc编译器中,使用的头文件因gcc版本62616964757a686964616fe59b9ee7ad ...

  5. 详解静态成员 什么是静态成员,静态成员和普通成员的区别

    什么是静态成员 首先了解一下为什么产生了静态成员的需求,有时候需要一些成员直接和类本身相关,而不是和所有对象保持关联.举一个C++ Primer中的例子: 一个银行账户类可能需要一个数据成员来表示当前 ...

  6. c# 静态成员和实例成员的区别

    c# 静态成员和实例成员的区别 静态成员也称为共享成员,例如静态属性 静态字段 静态方法:静态成员可以在类的实例之间共享. 静态类中只能有静态成员,不能有实例成员,因为静态类不能进行实例化: 在非静态 ...

  7. c/c++教程 - 2.4.2.7~8 类对象作为类成员,static静态成员变量函数

    目录 4.2.7 类对象作为类成员 4.2.8 静态成员 相关教程 4.2.7 类对象作为类成员 C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员. 例如: class A {} cla ...

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

    静态成员变量: 在类里用static对变量定义,缺省时初始化为0,不能在类中初始化,因为static变量在类实例化之前就已经存在. 在类外用<数据类型><类名>::<静态 ...

  9. 静态成员变量和静态成员函数(static)

    数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...

最新文章

  1. 【每日一算法】求众数
  2. openmp官方源码_MNN推理过程源码分析笔记(一)主流程
  3. 代码高亮_微信公众号代码高亮美化工具 Markdown Nice
  4. 什么是Hexo?妈妈再也不用担心我的网页编辑能力了
  5. DevOps发展的9个趋势
  6. 上采样(放大图像)和下采样(缩小图像)(最邻近插值和双线性插值的理解和实现)
  7. 7个免费强大的Ajax文件管理器
  8. 好的程序员“借”,伟大的程序员“偷”!
  9. 半小时在白板上写代码实现一致性哈希Hash算法
  10. java调用第三方短信接口 本地能发送短信,服务器却发不了,直到超时
  11. 开关电容共模反馈学习
  12. android10新特性 视频解码,Android万能视频播放器10-OpenGL ESMediaCodec解码数据t
  13. 分类变量——卡方检验
  14. crontab任务误删恢复及备份步骤
  15. 百度地图SDK配置与使用
  16. 2021年汽车和消费品安全、机动车排放召回情况及主要缺陷
  17. rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
  18. 西门子S7-1200组态PROFINET
  19. Cocos2dx 使用obb扩展包
  20. 苏州新导_智慧养老解决方案_养老院解决方案_智慧养老

热门文章

  1. 普通索引和唯一索引,难道还分不清
  2. 全网呕血整理:关于YOLO v3原理分析
  3. 【华为云技术分享】云图说|超赞!终于有人把云存储“三兄弟”讲清楚了!
  4. 成为高手前必懂的TCP干货
  5. java定时任务管理_基于SpringBoot+layui秒级定时任务管理:JTimer for JAVA项目
  6. 常用的变量值交换方法总结(C++实现)
  7. ctype库中关于字符串的常用函数汇总
  8. 数字图像处理 阈值分割 MATLAB实验
  9. android 自定义进度条 水量,Android自定义带水滴的进度条样式(带渐变色效果)...
  10. 【java基础知识】java打包运行时显示控制台内容