静态数据成员和静态成员函数(static)

2023-11-06

目录

一、关于静态成员 

二、静态数据成员和普通数据成员的共同点 

三、为什么要使用静态数据成员

四、关于静态数据成员的初始化

五、静态成员的访问方式 

六、静态成员函数

1.与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能够处理静态数据成员

2.静态成员函数只能访问static成员,包括数据成员和成员函数

3.非static成员函数既可以访问static数据成员,也可以访问非static数据成员。static成员函数只能访问satic成员

4.静态成员函数不与任何对象绑定在一起,不包含this指针 

七、实现一个类,计算程序中创建出了多少个类对象


一、关于静态成员 

      1.静态成员的声明要加个关键static。静态成员可以通过双冒号来使用即<类名>::<静态成员名 >,非静态成员则不能。
      2. static成员变量属于类(被存放在数据段中),不属于某个具体的对象(具体对象的内存是分配在堆中的),即使创建多个对象,也只为该变量分配一次内存,所有对象使用的都是这份内存中的数据。
     3.若它为public类型,当某个对象修改了它,也会影响到其他对象,所有对象都是“同甘共苦的” 

二、静态数据成员和普通数据成员的共同点 

静态数据成员和普通数据成员一样遵从public,protected,private访问规则;

三、为什么要使用静态数据成员

  1.每个对象都有自己都有的数据成员
  2.不同对象如何共享数据?
    全局变量:谁都可以访问,不安全
    静态数据成员:可以实现数据共享,该类的所有对象都共享这块静态存储空间它不属于某一个对象,它与整个程序的生命周期相同,即使某个对象消亡了,静态数据成员还存在,没有改变

四、关于静态数据成员的初始化

   在类内定义,类外声明
   声明的格式 <数据类型><类名>::静态数据成员 = <值>
   静态数据成员不能直接初始化 

   例如,错误的
   static int i=5;

//正确代码举例
#include<iostream>
using namespace std;
class A
{
	public:
		static int i;
};
int A::i=5;//::表示i是属于A这个类的 
int main()
{
	A a;
	cout<<A::i<<endl;//通过类名加域作用符直接访问 
	cout<<a.i<<endl;//通过对象访问 
	return 0; 
 } 
#include <iostream>
using namespace std;
class A
{
public: 
	static int i;
};
int A::i=9; 
int main(){
	A a,b;
	cout<<a.i<<endl;
	cout<<b.i<<endl;
	cout<<"----------"<<endl;
	b.i=8;
	cout<<a.i<<endl;//通过这两行的输出表明a,b两个对象共享内存空间 
	cout<<b.i<<endl;
    return 0;
}

五、静态成员的访问方式 

1.通过作用域运算符::直接访问静态成员 类名::静态成员 
2.通过对象.静态成员
3.通过指针->静态成员

//访问静态数据成员
#include<iostream>
using namespace std;
class A
{
	public:
		static int i;
};
int A::i=5;//::表示i是属于A这个类的 
int main()
{
	A a;
	cout<<A::i<<endl;//通过类名加域作用符直接访问 
	cout<<a.i<<endl;//通过对象访问 
	A * a1=&a;
	cout<<a1->i; //通过对象指针访问数据成员 
	return 0; 
 } 

//访问静态成员函数 
#include <iostream>
using namespace std;
class Box{
    public:
    	static int c;
    	int a,b;
    	Box(int x,int y){
    		a=x;b=y;
		}
        static void fun(){
        	cout<<c<<endl;
        	cout<<"static fun----"<<endl;	
		}      
};
int Box::c=8;
int main(){
    Box box(2,3);
    Box::fun();//使用作用域运算符直接访问静态成员 
    box.fun();//通过对象.引用名 
    Box * box2=&box; 
	box2->fun(); //通过类Box对象的指针 
    return 0;
}

六、静态成员函数

1.与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能够处理静态数据成员

#include<iostream>
using namespace std;
class Box
{
	public:
		static void fun()
		{
			cout<<"static---"<<endl;
		}
};
int main()
{
	Box box1;
	box1.fun();
	Box::fun();
	return 0; 
}

2.静态成员函数只能访问static成员,包括数据成员和成员函数

#include <iostream>
using namespace std;
class Box{
    public:
    	static int c;
    	int a,b;
    	Box(int x,int y){
    		a=x;b=y;
		}
        static void fun(){
        	cout<<c<<endl;
        	cout<<"static fun----"<<endl;	
		}      
};
int Box::c=8;
int main(){
    Box box(2,3);
    box.fun();
    Box::fun();
    return 0;
}

错误举例:

class Box{
    public:
    	static int c;
    	int a,b;
    	Box(int x,int y){
    		a=x;b=y;
		}
        static void fun(){
        	cout<<a<<endl;
        	cout<<"static fun----"<<endl;	
		}      
};

3.非static成员函数既可以访问static数据成员,也可以访问非static数据成员。static成员函数只能访问satic成员

#include <iostream>
using namespace std;
class Box{
    public:
    	static int c;
    	int a,b;
    	Box(int x,int y){
    		a=x;b=y;
		}
        void fun(){
        	cout<<a<<" "<<c<<endl;
        	cout<<"static fun----"<<endl;	
		}      
};
int Box::c=8;
int main(){
    Box box(2,3); 
    box.fun();//通过对象.引用名 
    return 0;
} 

4.静态成员函数不与任何对象绑定在一起,不包含this指针 

七、实现一个类,计算程序中创建出了多少个类对象

A的所有对象是构造出来或者拷贝构造出来的

 

 

#include<iostream>
using namespace std;
class A
{
public:
	A(int a = 1) :_a(a)
	{
		total++;
		use++;
	}
	A(const A& o)
	{
		total++;
		use++;
	}
	~A()
	{
		use--;
	}

	static int GetT()//静态成员函数没有this指针
	{
		return total;
	}

	static int GetU()
	{
		return use;
	}
private:
	int _a;
	                 //静态成员为所有类对象所共享
	static int total;//计算累计使用的对象
	static int use;//正在使用的对象
};

int A::total = 0;//计算累计使用的对象
int A::use = 0;//正在使用的对象


A Function(A x)
{
	A fun;
	return fun;
}

int main()
{
	A a_1;
	A a_2;
	A a_3;
	cout << "total: " << A::GetT() << "  use: " << A::GetU() << endl;

	Function(a_3);
	cout << "total: " << A::GetT() << "  use: " << A::GetU() << endl;
	return 0;
}


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态数据成员和静态成员函数(static) 的相关文章

  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • 自动映射器多对多 stackoverflowException

    我遇到以下映射的堆栈溢出 Mapper CreateMap
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 使用 C# 将多个音频样本混合到单个文件中

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个能够创建音频文件 mp3 或 wav 的库 NAudio http www codeple
  • Dapper 在执行时挂起

    我有一个 IDb连接 sql UPDATE 表名 SET json json lastupdate SYSDATE WHERE id id var param new DynamicParameters param Add json jso
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • Monotouch全局异常处理

    我在野外发现了一只令人讨厌的虫子 但我无法确定它的具体情况 有没有办法拥有全局 Try Catch 块 或者有办法处理 Monotouch 中未处理的任何异常 我可以包起来吗UIApplication Main args 在 try cat
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • unity 3D RPG教程(一)

    目录 声明 1 Create Project 2 Build Level 3 PolyBrush 发挥创意构建场景 4 Navigation 智能导航地图烘焙 5 MouseManager 鼠标控制人物移动 声明 本教程学习均来自U3D中文
  • mysql中ddl语句有哪些_什么是 DDL 语言?其中包括哪些语句?

    展开全部 DDL一般指数据定义语32313133353236313431303231363533e4b893e5b19e31333431373937言 数据库模式定义语言DDL Data Definition Language 是用于描述数
  • 华为OD机试 - 跳格子游戏(Java)

    题目描述 地上共有N个格子 你需要跳完地上所有的格子 但是格子间是有强依赖关系的 跳完前一个格子后 后续的格子才会被开启 格子间的依赖关系由多组steps数组给出 steps 0 表示前一个格子 steps 1 表示steps 0 可以开启
  • C++(14):函数返回类型auto推导

    C 11可以通过结合auto和decltype来动态的声明函数的返回值类型 include
  • plt.style.use设置背景样式

    利用matplotlib绘图设置背景 使用到plt style use 时 对这个参数做一下小结 matplotlib 使用某种样式 plt style use 参数可以是一个 URL 或者路径 指向自己定义的 mplstyle 文件 可以
  • 翁凯c语言作业8-3

    include
  • Vue初始化在HBuilderx中快速搭建

    HBuilderx快速新建VUE项目 一 安装HBuilderx开发工具 官网 HBuilderx HBuilderXH是HTML的第一个字母 Builder是builder X是HBuilder的下一个版本 我们也被称为HX HBuild
  • 01.minio基本介绍搭建使用

    MinIO 是一款基于 Go 语言的高性能 可扩展 云原生支持 操作简单 开源的分布式对象存储产品 官网 https min io 特点 高性能 作为高性能对象存储 在标准硬件条件下它能达到55GB s的读 35GG s的写速率 可扩容 不
  • 随机生成6位随机数(字母+数字)

    package com test public class test public static void main String args String randomcode 用字符数组的方式随机 String model 0123456
  • 人生应该接受的教育

    以下三段话 或许会让你的人生发生一些变化 如果有心改变 一切都不晚 一 比尔 盖茨告诉我们 1 社会充满不公平现象 你先不要想去改造它 只能先适应它 因为你管不了它 2 世界不会在意你的自尊 人们看的只是你的成就 在你没有成就以前 切勿过分
  • openssl基本原理及生成证书

    openssl基本原理及生成证书 openssl基本原理及生成证书 1 基本原理 2 生成证书 一 生成CA证书 1 创建私钥 2 创建证书请求 3 自签署证书 4 将证书导出成浏览器支持的 p12格式 二 生成server证书 1 创建私
  • 6套粒子群算法(内含matlab代码)

    粒子群算法 1 粒子群算法简介 一 粒子群算法的历史 粒子群算法源于复杂适应系统 Complex Adaptive System CAS CAS理论于1994年正式提出 CAS中的成员称为主体 比如研究鸟群系统 每个鸟在这个系统中就称为主体
  • 【C#】如何比较两个对象是否相等(重写Equals方法)

    问题 写单元测试时 需要对比两个对象是否相等 如果使用Assert AreEqual mockclass1 class1 永远无法通过 原因 这里使用了object默认的Equals方法 必须要引用同一个对象 才会返回true 默认的Equ
  • 485通讯与MODBUS的区别与联系

    最近做智能检测的项目 设备 串口之间的通讯比较多 一会儿485 一会儿modbus RTU 有点晕了 这里重新梳理一下RS485 485通讯协议 ModBus通讯协议 Modbus Rtu通讯这几个点的联系和区别 先说RS485吧 RS48
  • C++面试之const和static的联系和区别

    C 中的静态成员和静态函数的参考之前写的博客 C 中的静态成员和静态函数 Littlehero 121的博客 CSDN博客 C 中的全局变量和普通全局变量参考之前写的博客 全局变量 静态全局变量 静态局部变量和普通局部变量的区别 Littl
  • 003 Leaflet 第三个demo 地图上的面积测量

    一 使用到的文件 leaflet src js Leaflet Editable js leaflet measure path js leaflet css leaflet measure path css 面积测量区别于拉框测量面积而言
  • 125-Linux_守护进程

    文章目录 1 什么是Linux守护进程 2 如何创建Linux守护进程 切换当前工作目录到根目录 这样可以避免守护进程在其它目录中的文件被占用 使用fork 函数创建子进程 并在父进程中退出 在子进程中调用setsid 函数创建新的会话组
  • VScode配置PHP运行环境

    VS code配置PHP环境 第一步 配置了PHP环境 如果没有配置php环境的请见上篇个文章 点我 第二步 你需要有VS code 第三步 配置settings json 我们按下shift ctrl p然后搜索settings json
  • 百度联盟百青藤app流量变现

    app流量变现
  • 静态数据成员和静态成员函数(static)

    目录 一 关于静态成员 二 静态数据成员和普通数据成员的共同点 三 为什么要使用静态数据成员 四 关于静态数据成员的初始化 五 静态成员的访问方式 六 静态成员函数 1 与静态数据成员不同 静态成员函数的作用不是为了对象之间的沟通 而是为了