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 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
随机推荐
- HTML+CSS设计个人主页
在个人主页的设计中,我采用了圣代布局和div分块.效果图如下: <!DOCTYPE html> <html lang="en"> <head> ...
- PHP执行数据库定时备份 和手动还原
一 备份数据库 我的这个是在TP5上,其实不在TP5也可以 逻辑: 1 首先在自己电脑的cmd命令上测试备份数据库,成功才能往下进行所以得到 C:/luanxiede/mysql-5.7/bin/my ...
- Linux系列(7) - 链接命令
硬链接 拥有相同的i节点和存储block块,可以看做事同一个文件 可通过i节点识别 不能跨分区 不能针对目录使用,只能针对文件 软链接 类似Windows快捷方式 软链接拥有自己的i节点和block块 ...
- TP框架中的一些登录代码分享
<?php namespace Admin\Controller;use Think\Controller;class LoginController extends Controller{ p ...
- centos查找大文件
首先到相当的目录下面,按下面方式查找 find . -type f -size +800M -print0 | xargs -0 ls -lah或者从根目录(/)开始查找find / -type f ...
- 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 百篇博客分析OpenHarmony源码 | v14.14
百篇博客系列篇.本篇为: v14.xx 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...
- P3352-[ZJOI2016]线段树【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3352 题目大意 \(n\)个数字的一个序列,每次随机选择一个区间让这个区间所有数等于这个区间的最大值,重复\(q ...
- Go变量与基础数据类型
一.基础介绍 Go 是静态(编译型)语言,是区别于解释型语言的弱类型语言(静态:类型固定,强类型:不同类型不允许直接运算) 例如 python 就是动态强类型语言 1.Go 的特性: 跨平台的编译型语 ...
- JVM类加载器的分类
类加载器的分类 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定 ...
- Django整理(五) - 请求与响应 - request对象
请求对象 一.客户端传参的几种方式 1. 通过URL路径(path)传递,例如:http://127.0.0.1:8000/news/1/2,两个参数:id和page 2. 通过 query stri ...