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 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
随机推荐
- CVPR顶会论文爬取存入MySQL数据库(标题、摘要、作者、PDF链接和原地址)
main.py import pymysql import re import requests # 连接数据库函数 from bs4 import BeautifulSoup def insertC ...
- Lambda 表达式详解
目录 前言 预备知识,理解委托的构成 引用实例方法的委托 引用静态方法的委托 Lambda 表达式的实际编译结果 CASE 1 没有捕获任何外部变量的Lambda 表达式 CASE 2 捕获了外部方法 ...
- sql查询字段语句
SELECT * from jd_content where 景点简介 like '%东城%'
- express 路由匹配和数据获取
express配置路由只需要通过app.method(url,func)来配置,其中url配置和其中的参数获取方法不同 直接写全路径 路由中允许存在. get请求传入的参数 router.get(&q ...
- 简述编写Django应用的基本步骤
(1)创建项目,cd到一个你想要放置你代码的目录.Django -admin startproject mysite. Django project即一个Django项目实例需要的设置项的集合,包括数 ...
- 分享一下我的Python自学历程,分享下我自己学习方法
其实关于编程这事儿没有接触的那么早,大一的时候没什么关注点,有一门课是vb,一天天的,就抄抄作业啥的就完事儿了.当时也觉的自己不是学编程的料,想着以后估摸也不会干开发相关的工作. 我的自学历程 阴差阳 ...
- 使用VUE+原生PHP完成搜索后分页的效果
html代码: <!doctype html> <html lang="en"> <head> <meta charset="U ...
- 好久没发文了,一篇Vue3的Composition API使用奉上
Composition API Composition API是Vue3中推荐的组件代码书写方式,相较于传统的Options API来说,它能让业务逻辑处理和后期代码维护变的更加简单. 首先我们来看O ...
- 通用JS9
Symbol.toStringTag 该符号作为一个属性表示"一个字符串,该字符串用于创建对象的默认字符串描述."由内置方法Object.prototype.toString()使 ...
- 基于深度学习的建筑能耗预测01——Anaconda3-4.4.0+Tensorflow1.7+Python3.6+Pycharm安装
基于深度学习的建筑能耗预测-2021WS-02W 一,安装python及其环境的设置 (写python代码前,在电脑上安装相关必备的软件的过程称为环境搭建) · 完全可以先安装anaconda(会自带 ...