C++ 关于静态成员对象、函数学习整理:

类的静态成员为类创建的所有对象所共有的成员,不单独属于某一对象,而属于整个类,而静态成员分为静态成员变量、静态成员函数。

静态成员变量(静态数据成员):

引入及解决问题的优势:

类创建了多个对象,对象的具体成员对象各不相干,而在大量对象的基础上,出现了一部分共有属性的对象

(例如:

1、银行系统中,用户作为单独对象时,成员变量中,银行储存利率为所有用户公有一致的对象成员;

2、班级系统所有同学作为单独变量,需统计班级莫科目总分,该成员属于全体公有不属于单一对象

由上面引例了解到以上两种情况如设置为普通对象的成员:

例1:浪费了大量地址空间去存储一致的对象成员

例2:全班总分数对每一个同学单一的对象而言成员没有实际意义,而在每位同学对象依次录入成绩的同时总成绩变化,如何更改之前每个对象的总成绩?引发大量重复修改值的操作

因此优化引出静态成员变量的概念:

  1. 多个同类对象共用静态成员变量,节约空间
  2. 多个同类对象共用静态成员变量,一改全改便于维护

静态成员变量的定义及初始化:

声明(类内):

static 类型名 静态成员变量名;

定义、初始化(类外): 

类型 类名::静态成员变量 = 初始化值;//初始化

在初始化时需要区分静态变量是否为整数类型,不同的类型决定了初始化位置不同。

  • 整数类型的静态成员变量可以在定义或声明中的某一处完成初始化,但不能同时在两处进行初始化,即便初始化的值是相同的也不行。
  • 非整数类型的静态成员变量则必须且只能在定义语句中进行初始化,类内的声明语句中不允许初始化操作。
  • 类内声明,类外初始化定义
    //1.如何对静态成员变量进行初始化?
    // 
    class A
    {
    	//静态成员变量类型为整型:
    	//可以在声明处初始化(仅静态常量!),也可在定义处初始化
    	const static int a = 10; //仅静态常量!
    	static int b;//普通静态成员变量只能在类外初始化
    
    	//静态成员变量类型非整型,只能在类外定义处初始化
    	static string c;
    };
    int A::b = 10;
    string A::c = "hello";

注意:

  • 静态成员变量在类外初始化,不能在类内构造函数初始化;
    • 因为静态成员变量不属于某一个对象,而单属于类(或全体对象),普通成员在类内的构造函数内初始化,二者需区分开;
    • 如果可以在类的构造函数中初始化,那么每创建一个对象,静态成员变量就要被初始化一次,这显然是错误的;
  • 静态成员变量仅在 定义的时有static,初始化时没有static;
  • 静态成员变量为私有类型,在类外初始化,类外并不在类外成员函数内,所以满足private访问规则;
  • 初始化时使用作用域运算符标明所属类。

静态成员变量的使用

类外函数使用静态成员对象时,需得更改静态成员变量的私有属性改为公有public属性方可使用

//静态成员变量属于类,因此可以通过类名对它进行访问。访问形式为:
类名::成员变量;

//也可以通过对象名访问,访问形式为:
对象名.静态成员变量;
//编译器通过对象能推出类类型。

引例:上例2、班级系统所有同学作为单独变量,需统计班级某科目总分

//这是配置好的模板文件
#include <iostream>
#include <string>
using namespace std; 

class Stu
{
private:
	string name;
	string num;
	int grade;

public:
	static int sum;//静态成员对象的定义
	Stu(string na = "XX", string nu="XXXX", int g=90) :name(na), num(nu), grade(g)
	{
		sum += grade;
	};
};
int Stu::sum = 0;//静态成员对象初始化

int main()
{
	Stu stu[5]{ {"李华","211",98},{"刘明","212",88},{"王雅","213",66},{"乔伊","214",77},{"曹颖","215",97} };
	cout << "总成绩为:" << Stu::sum << endl;//前提静态成员变量为public公有访问权限下,私有错误
	cout << "总成绩为:" << stu[0].sum << endl << endl;

	Stu stu2{ "陆雅","216",100 };//一改全改
	cout << "添加新成绩:100,一改全改:"<<endl;

	cout << "总成绩为:" << stu[0].sum << endl;
	cout << "总成绩为:" << stu[1].sum << endl;
	cout << "总成绩为:" << stu[2].sum << endl;
	cout << "总成绩为:" << stu[3].sum << endl;
	cout << "总成绩为:" << stu[4].sum << endl;
	cout << "总成绩为:" << stu2.sum << endl;
	return 0;
}

输出:

静态成员函数

主要是为了处理静态成员数据。

静态成员函数可以在类内定义,也可以在类外定义(静态成员变量只能类内声明,类外定义初始化)

在类外定义时,不加static

在类内声明格式为:

static 返回类型 静态成员函数名(参数表);

通过类名调用

类名::静态成员函数名(实参表); //在类外访问必须是public

通过对象名调用

对象名.静态成员函数名(实参表);//在类外访问必须是public,编译器通过对象能推出类类型。

当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋予成员函数的this指针。而静态成员函数不属于某一对象,因此它没有this指针。由此可以得出:

静态成员函数不能访问类的非静态成员(包括非静态成员变量和非静态成员函数)。即需要用到this指针的地方静态成员函数是不能访问的。

引例:

#include <iostream>
#include <string>
using namespace std;

class Student //定义Student类
{
private:
    string m_name;    //姓名
    string m_num;        //学号
    float m_score;    //分数
    static float sum; //分数总和
    static int count; //学生总数
public:
    Student(string name,string num, float s) :m_name(name), m_num(num), m_score(s) 
    {
        sum += m_score; //计算总分
        count++;        //累统计总人数
    }
    static float average(); //声明静态成员函数
};

float Student::average() //定义静态成员函数
{
    return(sum / count);
}

float Student::sum = 0; //对静态成员变量初始化
int Student::count = 0; //对静态成员变量初始化

int main()
{
        Stu stu[5]{ {"李华","211",98},{"刘明","212",87},
        {"王雅","213",66},{"乔伊","214",77},{"曹颖","215",97} };
};

    cout << "学生的平均成绩为:" << Student::average() << endl;//调用静态成员函数

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/347777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中SimpleDateFormat时YYYY与yyyy以及HH和hh的区别注意踩坑

场景 Java开发手册中为什么要求SimpleDateFormat时用y表示年&#xff0c;而不能用Y&#xff1a; Java开发手册中为什么要求SimpleDateFormat时用y表示年&#xff0c;而不能用Y_simpledateformat 怎么确定y就是年-CSDN博客 在使用SimpleDateFormat在获取当前日期时因使用了YY…

[极客大挑战 2019]Secret File1

上来就说看不到&#xff0c;先看看源码&#xff0c;发现./Archive_room.php 点secret直接跳到了end&#xff0c;抓包看看&#xff0c;找到了secr3t.php 过滤了很少的关键词&#xff0c;提示flag在flag.php&#xff0c;过去发现还是看不到 尝试用php伪协议读取flag.php的源码 …

creo草绘3个实例学习笔记

creo草绘3个实例 文章目录 creo草绘3个实例草绘01草绘02草绘03 草绘01 草绘02 草绘03

Web08--JavaScript高级

1、BOM对象 BOM&#xff1a;browser object model 浏览器对象模型 BOM对象包括window对象、screen对象、history对象、location对象、navigator对象。 1.1 window对象 所有的浏览器都支持window对象。它表示的浏览器窗口 window对象是js中的顶层对象&#xff0c;所有的j…

直播引流到微信,如何才算合规?-数灵通

抖音直播如今越来越受到大众的关注&#xff0c;许多朋友都会准时守在直播前。不少人被直播带来的收益所吸引&#xff0c;纷纷加入到创作者的行列中。直播间巨大的流量背后&#xff0c;蕴藏着无法估量的经济效益和赚钱机会。 确实有人考虑将部分抖音直播的流量引入微信&#xff…

TS基础知识点快速回顾(上)

基础介绍 什么是 TypeScript&#xff1f; TypeScript&#xff0c;简称 ts&#xff0c;是微软开发的一种静态的编程语言&#xff0c;它是 JavaScript 的超集。 那么它有什么特别之处呢? js 有的 ts 都有&#xff0c;所有js 代码都可以在 ts 里面运行。ts 支持类型支持&#…

退货通知单下推销售退货单,无法下推问题排查

文章目录 退货通知单下推销售退货单&#xff0c;无法下推问题排查报错界面排查原因 退货通知单下推销售退货单&#xff0c;无法下推问题排查 报错界面 排查 检验单已做。 原因 合格未勾选判退。

antv/g6绘制数据流向图

antv/g6绘制数据流向图 前言接口模拟数据htmlts页面效果 前言 在业务开发中需要绘制数据流向图&#xff0c;由于echarts关系图的限制以及需求的特殊要求&#xff0c;转而使用antv/g6实现&#xff0c;本文以代码的方式实现数据流向需求以及节点分组,版本"antv/g6": “…

爬虫js逆向分析——x平台(前置知识:python执行js代码)

import execjs# 读取到js字符串 with open(v1.js, moderb) as f:js_string f.read().decode(utf-8)JSCode execjs.compile(js_string)# 调用js代码&#xff0c;如果有参数则依次往后逗号&#xff0c;写 res JSCode.call(test, eric)print(res)js文件中正常写代码即可。

前端vue集成echarts图形报表样例

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f415;1.在项目终端下载echarts依赖包&#x1f3e8;2.在main.js中导入echarts资源包并使用&#x1f380;3.在.vue文件中直接使用echarts&#xff0c;下面是一个样例&a…

Unity 组合模式(实例详解)

文章目录 示例1&#xff1a;Unity中的图形界面元素组合示例2&#xff1a;Unity中的游戏对象层级组合示例3&#xff1a;Unity中的场景图节点组合 在Unity中&#xff0c;组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成…

构建未来的数字世界:创新开放API接口认证解决方案

目录 1、引言 1.1 数字世界的发展 1.2 API接口的重要性 1.3 API接口认证的挑战 2、现有的API接口认证解决方案 2.1 基于令牌的认证方法 2.2 OAuth认证 2.3 OpenID认证 2.4 API密钥认证 3、创新开放API接口认证解决方案 3.1 双因素认证 3.2 生物特征认证 3.3 区块链…

Information Symmetry Matters

RG means ‘Relation Guidance’ 辅助信息 作者未提供代码

MySQL 初识MySQL

目录 1 数据库1.1 前言1.2 数据库分类1.2.1 关系型数据库&#xff08;RDBMS&#xff09;1.2.2 非关系型数据库1.2.3 关系型数据库与非关系型数据库的区别 2 链接数据库3 SQL分类4 存储引擎 1 数据库 1.1 前言 到底什么是MySQL? 大家都知道MySQL叫做数据库。那么什么是数据库…

系统架构15 - 软件工程(3)

软件过程模型 瀑布模型特点缺点 原型化模型特点两个阶段不同类型注意 螺旋模型V 模型特点 增量模型特点 喷泉模型基于构件的开发模型(CBSD)形式化方法模型敏捷模型特点“适应性” (adaptive) 而非“预设性” (predictive)“面向人的” (People-oriented) 而非“面向过程的” (P…

vue2、vue3,生命周期详解

一、Vue2.x Vue2的生命周期 是指Vue实例从创建到销毁的整个过程中&#xff0c;会经历一系列的阶段和回调函数。它分为8个阶段&#xff0c;包括了组件的创建、挂载、更新和销毁等过程。 1、beforeCreate: 在实例初始化之后&#xff0c;但在数据观测和事件配置之前被调用。此…

【Linux编译器-gcc/g++使用】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 设计样例&#xff0c;先见一下 方案一&#xff1a; 方案二&#xff1a; 在企业里面一般维护软件的源代码的话&#xff0c;要维护几份&#xff1f; 方案一&…

如何在短时间内制作出专业的产品说明书模板

产品说明书是企业向客户介绍产品的重要工具&#xff0c;能够直观地展示产品特点、功能以及使用方法。一个好的产品说明书模板可以帮助企业在短时间内制作出专业的产品说明书。那么怎样去做这个产品说明书模板呢&#xff1f;其实主要关注以下几个关键要素。 | 一、明确产品需求和…

x-cmd pkg | 7za - 7-Zip 的命令行版本

目录 简介首次用户主要特征竞品和相关作品进一步阅读 简介 7za 是一个开源的文件压缩和解压工具&#xff0c;是 7-Zip 的命令行版本。 7z 是一种拥有极高压缩比的格式&#xff0c;7za 提供压缩&#xff0c;解压&#xff0c;列举文件等功能除此之外&#xff0c;7za 还支持多种…

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资…