静态成员变量和静态成员函数
静态成员变量
一个类中可以有一个或多个静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。
static 成员变量和普通 static 变量一样,都在内存分区中的全局数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
静态成员变量必须初始化,而且只能在类体外进行。例如:
int Student::m_total = 10;
初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。
静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。
静态成员函数
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。
普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。
静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
静态成员变量和静态成员函数相关推荐
- C++静态成员变量和成员函数
静态成员变量和成员函数 简介 sizeof不将静态成员变量的大小计算在内 可以通过类名来访问静态成员 静态成员函数不能访问类的非静态成员 简介 static加在局部变量的前面改变其存储类型使之成为静态 ...
- c++中静态成员变量和静态成员函数
静态成员变量 在一个类中,若将一个成员变量声明为static,这种成员成为静态成员变量,与一般的数据成员不同,无论建立了多少个对象,都只想有一个静态数据的拷贝,静态成员变量,属于某个类,所有对象共享 ...
- 13.C++-静态成员变量、静态成员函数
首先回顾下成员变量 能通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 再来讲讲类的静态成员变量 介绍 静态成员变量属于整个类所有 静态成员变量的生命期 ...
- C++面试题-面向对象-静态成员变量以及静态成员函数
C++面试题-面向对象-静态成员变量以及静态成员函数 问:在类中,静态数据成员和普通数据成员有何区别? 答: 普通数据成员属于类的对象,对象被创建后,普通数据成员才会分配内存.静态数据成员属于整个类, ...
- C++静态成员变量与静态成员函数
类的静态成员有两种:静态成员变量和静态成员函数,语法是在普通成员变量和成员函数前加static关键字. 0.定义 class CRect{ public:void show();//普通成员函数sta ...
- C++的静态成员变量和静态成员函数
C++的静态成员变量和静态成员函数 静态成员变量和静态成员函数算是C++面向对象编程中的一个重点和难点,这里的静态具体指什么呢?与普通的成员变量和成员函数相比,静态成员函数和静态成员变量是属于类的,而 ...
- 类中的静态成员变量和静态成员函数
static静态成员函数 1.static 修饰成员变量 2.static修饰静态成员函数 引子: 静态成员函数: 注意: 3.const 修饰静态成员 静态成员案例 案例1:静态成员 统计类 实例化 ...
- qt 静态成员变量_Qt 静态成员函数的调用非静态成员变量,非静态成员函数
在多人开发的项目中,一些通用的工具类接口可以用静态成员函数.方便调用,并且不容易调用错误. 静态成员函数不传递this指针(不能->),不识别对象个体,所以经常用于对静态数据成员进行操作.不能操 ...
- c++ ——静态成员变量和静态成员函数
前言 c++ 静态成员变量用static 关键字来声明,是整个类的数据成员,其存储不占用某个具体对象的空间,其存储在静态存储区. c++ 静态成员函数用static 关键字来声明,用于处理静态成员变量 ...
最新文章
- python模块--json \ pickle \ shelve \ XML模块
- pthread_t描述说明
- 以实例让你真正明白mapreduce---填空式、分布(分割)编程
- 测试架构师10年经验分享:测试小工到资深专家必备这5项技能
- linux内核中断向量表,Linux内核中断之中断向量表IDT的初始化
- 第一周练习代码以及备注
- numpy下, meshgrid
- Linux消息队列讲解
- idea--Preferences
- 检索的原理和方法步骤
- Pure Virtual Function
- TI芯片(335x、437x、572x)uboot设置logo居中
- 软件工程毕业设计课题(63)微信小程序毕业设计JAVA校园新生报到小程序系统设计与实现
- 牛客练习赛52.Galahad(树状数组维护区间不相同数的和)
- 和成熟男人谈恋爱是什么感觉
- 如何实现开机自动挂载
- HaaS-Python实现智能水族生态控制器
- opencv surf特征点检测(二),API接口分析
- 魔兽世界 8.1 服务器维护时间,魔兽世界8.1上线时间 18个主要内容预告
- 计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)
热门文章
- python3项目源代码下载_GitHub 上适合新手的 Python 开源项目
- 【历史上的今天】11 月 15 日:全球首款商用微处理器;微软进军游戏界;ICQ 诞生
- 熊猫烧香制造者李俊出狱以后的六种出路
- 模糊神经网络:基于模糊神经网络(Fuzzy Neural Networks,FNN)的数据分类(提供MATLAB代码)
- 第二届「科学探索奖」获奖名单公布
- 计算机管理员考核指标库,仓库管理员绩效考核指标.docx
- 帝国模板留言板增加自定义字段教程
- 为什么程序员适合做自由职业者
- CCFL的完整形式是什么?
- html 水平分割,HTML设置水平分割线