C++类的静态成员变量与静态成员函数
1、类的静态成员变量
C++类的静态成员变量主要有以下特性:
1.静态成员变量需要类内定义,类外初始化
2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间。
3.静态成员变量通过类名访问,也可以通过对象访问,同一类的不同对象,静态成员共享同一份数据
下面通过代码验证以上三种说法:
#include <iostream>
using namespace std; class Base{
public:
static int val1; //类内定义,类外初始化,如果直接初始化编译器会报错
int val2;
private:
static int val3;
};
int Base::val1(1); //类外初始化,通过类名访问静态成员
int Base::val3(2); //类外初始化,即便是私有属性也可以通过类名访问静态成员 int main()
{ Base base1;
Base base2; base1.val1 = 10;
base2.val1 = 11;
cout << sizeof(Base) <<endl; //类的大小只有四字节,说明静态成员并不依赖类存在,有自己的独立空间
cout << base1.val1 << " " << base2.val1 << endl;
system("pause");
return 0;
}
代码运行结果为:

通过代码运行结果我们可以确定,Base类的大小只有4字节,说明类静态成员有自己的独立空间,位于静态全局区,且所有对象共享同一份内存,代码修改了base2对象的静态变量val1,base1的val1也输出为11,说明他们共享同一份内存。
那么如果一个类继承了同名的静态变量,会不会共享内存空间呢?下面通过代码验证:
#include <iostream>
using namespace std; class Base{
public:
static int val1; //类内定义,类外初始化,如果直接初始化编译器会报错
int val2;
private:
static int val3;
};
int Base::val1(1); //类外初始化,通过类名访问静态成员
int Base::val3(2); //类外初始化,即便是私有属性也可以通过类名访问静态成员 class Son : public Base {
public:
static int val1; //类内定义,类外初始化,与父类同名的静态变量
};
int Son:: val1 = 3; //类外初始化 int main()
{ Son son1;
cout << son1.val1 << " " << son1.Base::val1 << endl; //通过对象方式访问静态成员变量
cout << Son::val1 << " " << Base::val1 << endl; //通过类名方式访问静态成员变量
system("pause");
return 0;
}
代码运行结果为:

通过代码验证,当子类继承父类,且子类和父类含有同名的静态变量,他们并不会共享内存空间,与常量定义一致,而是各自开辟了空间,只不过通过对象访问父类中的静态成员要加上父类的作用域。
2、静态成员函数
类的静态成员函数应该明确以下几点:
1.函数不占用对象空间,静态成员函数也不占用对象空间
2.所有对象共享同一个函数
3.静态成员函数不能访问非静态成员变量
4.静态成员函数也可以通过类名直接访问
5.静态成员函数有访问权限
下面通过代码验证:
#include <iostream>
using namespace std; class Base{
public:
static int val1;
int val2; static void func1(){
//val2 = 10; //静态成员函数访问非静态成员变量,编译会报错
val1 = 10; //只能访问静态成员
cout << "func1()" << endl;
}
private:
static void func2(){
cout << "func2()" << endl;
}
}; int Base::val1(1); int main()
{
cout << "Base size = " << sizeof(Base) << endl;
Base base1;
Base base2; base1.func1(); //通过对象访问
//base1.func2(); //类的私有权限,不能访问
Base::func1(); //通过对象访问
// Base::func2(); //私有权限,不能访问 cout << base1.val1 << " " << base2.val1 << endl;
system("pause");
return 0;
}
代码运行结果为:

代码运行结果说明,静态成员函数也不占用对象空间,所有对象共享同一个静态成员函数,代码中,base1通过静态成员函数修改的静态成员后。base2对象的静态成员也被修改,其次,.静态成员函数可以通过类名直接访问,静态成员函数有访问权限,都已在代码中说明了。
C++类的静态成员变量与静态成员函数的更多相关文章
- C++类中的静态成员变量与静态成员函数
最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
- C++ 类中的静态成员变量,静态成员函数
//类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* ...
- 13.C++-静态成员变量、静态成员函数
首先回顾下成员变量 能通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 再来讲讲类的静态成员变量 介绍 静态成员变量属于整个类所有 静态成员变量的生命期 ...
- C++解析(14):静态成员变量与静态成员函数
0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...
- c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)
一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...
- static作用,静态成员变量和静态成员函数
static关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接. 随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长. 在类的内部使用s ...
- Java中非静态成员变量、静态成员变量的初始化时机
转: Java中非静态成员变量.静态成员变量的初始化时机. 2018年05月22日 11:48:11 SilenceCarrot 阅读数 421 版权声明:技术就要分享才有意思,欢迎大家分享(注明 ...
- C++@类的静态成员变量和静态成员函数
参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...
- C++类中的静态成员变量与静态成员函数的使用
代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...
- C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
随机推荐
- mybatis一对多联表查询的两种常见方式
1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为 ...
- Linux系列(13) - CentOs 8 配置静态IP
step-1 vim etho的配置文件 [root#localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 step-2 新增修改以下 ...
- 停止:service jenkins stop,提示:Failed to stop jenkins.service: Unit jenkins.service not loaded.
uni@uni-virtual-machine:~$ service jenkins stop Failed to stop jenkins.service: Unit jenkins.service ...
- python学习笔记(一)-基础知识
O.解释型语言和编译型语言 编译型语言就是先把写好的程序翻译成计算机语言然后执行,就是所谓的一次编译到处运行,比如c.c++就是编译型语言,这样的语言特点是运行速度快,但是需要事先把程序编译好才可以. ...
- 对帧率、I/P率、I帧间隔的理解
码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒.通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比 ...
- JQuery EasyUI 结合ztrIee的后台页面开发
JQuery EasyUI 结合 zTree树形结构制作web页面.easyui用起来比较简单,很好的封装了jquery的部分功能,使用起来更加方便,但是从1.2.3版本以后,商业用途是需要付费的, ...
- Redis高可用解决方案:哨兵(Sentinel)
哨兵是Redis的高可用解决方案:由多个哨兵组成的系统监视主从服务器,可以将下线的主服务器属下的某个从服 务器升级为新的主服务器,继续保障运行. 启动并初始化Sentinel redis-sentin ...
- 使用Jacoco统计服务端代码覆盖情况实践
一.背景 随着需求的迭代,需求增加的同时,有可能会伴随着一些功能的下线.如果不对系统已经不用的代码进行梳理并删除不需要的代码,那么就会增加系统维护成本以及理解成本.但经历比较长的迭代以及系统交接,可能 ...
- T-SQL——透视PIVOT动态获取待扩展元素集
目录 0.背景说明 1.准备测试数据 2.示例1--利用SELECT循环赋值 3.示例2--使用游标 4.示例3--使用FOR XML PATH() 5. 参考 志铭-2021年10月8日 00:57 ...
- Dapr逐渐被点燃
Dapr被点燃 Dapr的热度个人认为才刚刚热起来,9月份我写了Dapr + .NET Core实战一共10篇,从基础概念到简单的实战,但是有很多人感兴趣,具体表现在我个人维护的QQ群,人数从80人左 ...