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 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
随机推荐
- 微信小程序+腾讯云直播的实时音视频实战笔记
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Go学习【01】:初步学习需要的知识
理解以下知识,初步写简单go项目就足够了 语言参考(基础篇) 基本语法 基本组成 包声明 引入包 函数 变量 语句 & 表达式 注释 其它(可忽略) go没有像php.js那样需要在文件开始申 ...
- 链式调用+对象属性与遍历+this指向+caller/callee
之前的作业: 提示: 在开发的时候尽量在函数内部将作用都给调用好,在外部就能够直接使用 链式调用: 正常这样是不行的,因为没有具体返回值: return 具体的对象,这样的才是链式操作,jquery ...
- 执行sudo apt-get update,连接失败
问题:sudo apt-get update连接失败 错误:1 http://cn.mirrors.ustc.edu.cn/ubuntu bionic InRelease 连接失败 [IP: 218. ...
- 定要过python二级 第一套
1.和强类型语言相对应的是弱类型语言,Python.JavaScript.PHP 等脚本语言一般都是弱类型的.弱类型语言有两个特点: 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一 ...
- 关于go mod 的使用和goland 配置 go mod
一.关于go modules 1.1 go modules 是go1.11 新加的特性 现在已有go 1.13.4 了本人用了就是最新版的 1.2关于modules 官方定义 模块是相关Go包的集合. ...
- 【理解OS】1.保护模式概述
这个系列文章主要目的是为了记录我个人学习保护模式后的总结与一点点的思考.我也是一个学习者,其中由错误在所难免,若各位朋友指出将不胜感激. 1. Intel CPU的运行模式概述 这里我将粗略介绍Int ...
- Redis对象
概述 Redis并没有使用基础数据结构去实现键值数据库,而是基于数据结构封装了一个个对象. 类型和编码 由于Redis是键值数据库,所以每次存储数据时,至少包含两个对象,即K.V对应的对象.其数据结构 ...
- 羽夏闲谈——VSCode 配置 C/C++环境
前言 VSCode是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言.我的环境是64位Win10,如果是其他系统请自行判断调整.本人根据网上的配置方法在结合本 ...
- 洛谷3648 [APIO2014]序列分割(斜率优化+dp)
首先对于这个题目. qwq 存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关. 举一个小栗子 \(a\ b\ c\) 将这个东西分成两块. 如果我们先分割\(ab\)之间的话,\(an ...