静态成员函数与成员变量_C++静态成员变量及函数
没有很快乐,也没有不快乐,好像不该这样,但也只能这样,成长也许如此,行于奔溃边缘又慢慢自愈吧。。。
---- 网易云热评
一、静态成员变量
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++静态成员变量及函数相关推荐
- python函数封装的好处_C++用类封装函数有什么好处么?
myListSort这种用法称为"函数对象"或"仿函数".从名称可以看出来,myListSort是一个类(或结构),而非函数,但是它的使用方法又颇似函数,即可以 ...
- c c++ 函数内数组初值_C编程基础-关键字-函数和指针
C术语的基本定义,例如关键字,标识符,运算符,指针,数据类型,void main(),函数和递归. 在大多数情况下,我们突然无法回答一些简单的问题,例如C中的关键字是什么,C中的标识符是什么,C中的数 ...
- 单片机sleep函数的头文件_C语言之Sleep函数
Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include ,在Linux下,gcc编译 ...
- 单片机sleep函数的头文件_c语言的 sleep函数到底在哪个头文件里啊
展开全部 在里面. 在VC中使用时,sleep函数的头文件为windows.h,在Linux下,gcc编译器中,使用的头文件因gcc版本62616964757a686964616fe59b9ee7ad ...
- 详解静态成员 什么是静态成员,静态成员和普通成员的区别
什么是静态成员 首先了解一下为什么产生了静态成员的需求,有时候需要一些成员直接和类本身相关,而不是和所有对象保持关联.举一个C++ Primer中的例子: 一个银行账户类可能需要一个数据成员来表示当前 ...
- c# 静态成员和实例成员的区别
c# 静态成员和实例成员的区别 静态成员也称为共享成员,例如静态属性 静态字段 静态方法:静态成员可以在类的实例之间共享. 静态类中只能有静态成员,不能有实例成员,因为静态类不能进行实例化: 在非静态 ...
- c/c++教程 - 2.4.2.7~8 类对象作为类成员,static静态成员变量函数
目录 4.2.7 类对象作为类成员 4.2.8 静态成员 相关教程 4.2.7 类对象作为类成员 C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员. 例如: class A {} cla ...
- C++中类的静态成员变量和静态成员函数
静态成员变量: 在类里用static对变量定义,缺省时初始化为0,不能在类中初始化,因为static变量在类实例化之前就已经存在. 在类外用<数据类型><类名>::<静态 ...
- 静态成员变量和静态成员函数(static)
数据成员可以分静态变量.非静态变量两种. 静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
最新文章
- 【每日一算法】求众数
- openmp官方源码_MNN推理过程源码分析笔记(一)主流程
- 代码高亮_微信公众号代码高亮美化工具 Markdown Nice
- 什么是Hexo?妈妈再也不用担心我的网页编辑能力了
- DevOps发展的9个趋势
- 上采样(放大图像)和下采样(缩小图像)(最邻近插值和双线性插值的理解和实现)
- 7个免费强大的Ajax文件管理器
- 好的程序员“借”,伟大的程序员“偷”!
- 半小时在白板上写代码实现一致性哈希Hash算法
- java调用第三方短信接口 本地能发送短信,服务器却发不了,直到超时
- 开关电容共模反馈学习
- android10新特性 视频解码,Android万能视频播放器10-OpenGL ESMediaCodec解码数据t
- 分类变量——卡方检验
- crontab任务误删恢复及备份步骤
- 百度地图SDK配置与使用
- 2021年汽车和消费品安全、机动车排放召回情况及主要缺陷
- rustdesk RustDesk 自建服务器,局域网可以连接服务器,外网就不可以了。 求高手指点迷津。
- 西门子S7-1200组态PROFINET
- Cocos2dx 使用obb扩展包
- 苏州新导_智慧养老解决方案_养老院解决方案_智慧养老
热门文章
- 普通索引和唯一索引,难道还分不清
- 全网呕血整理:关于YOLO v3原理分析
- 【华为云技术分享】云图说|超赞!终于有人把云存储“三兄弟”讲清楚了!
- 成为高手前必懂的TCP干货
- java定时任务管理_基于SpringBoot+layui秒级定时任务管理:JTimer for JAVA项目
- 常用的变量值交换方法总结(C++实现)
- ctype库中关于字符串的常用函数汇总
- 数字图像处理 阈值分割 MATLAB实验
- android 自定义进度条 水量,Android自定义带水滴的进度条样式(带渐变色效果)...
- 【java基础知识】java打包运行时显示控制台内容