静态数据成员

简介: 静态数据成员

静态数据成员

定义格式:

static 类型名 静态数据成员名 ;

详解:由于静态数据成员属于本类的所有对象共享,不属于特定类对象,因此在未产生类对象时作用域就可见,即:在未产生类的实例时,就可以对它进行操作。

初始化:

类型 类名 :: 静态数据成员 = 初始化值 ;

详解:静态数据成员必须在类外初始化,不可在类体内,因为:构造函数中,如果可以,则每次建立对象,都会对静态数据成员的值进行修改,这违背静态数据成员的使用目的;类内也不可以初始化,不要忘记,类只是一种数据类型,数据类型中怎么能赋初值呢?

静态成员函数

定义格式:

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

调用方式:

类名 :: 静态成员函数名 (实参表) ;

对象名 . 静态成员函数名 (实参表) ;

注意:

类外定义静态成员函数时,定义格式和普通成员函数定义格式相同,不再使用static修饰

使用对象名和成员运算符(.)调用成员函数时,并非该函数属于某一对象,只是类与对象间的桥梁,为了能处理静态数据成员;

静态成员函数不能默认引用本类非静态数据成员的原因:

当调用一个对象的非静态成员函数时,系统会将该对象的起始地址赋予成员函数的this指针。然而,静态成员函数不属于对象,无this指针。所以静态成员函数不能访问类的默认非静态成员(非静态成员函数和非静态数据成员)。

举例说明一种静态成员函数访问非静态数据成员的方式:

#include <iostream>
using namespace std;
class Point {
public:
  Point(int a) {                      //构造函数
    x = a;
    y += x; 
  }
  static void f1(Point m);           //静态成员函数的原型声明
private:
  int x;
  static int y;                      //静态数据成员
};
void Point::f1(Point m) {              //静态成员函数的类外定义      参数表中创建对象
  cout << "x=" << m.x << endl;       //静态成员函数通过对象访问非静态数据成员
  cout << "y=" << y << endl;         //静态成员函数处理静态数据成员
}
int Point::y = 0;                      //静态数据成员初始化
int main() {
  Point P1(5), p2(10);
  Point::f1(P1);                     //静态成员函数调用时一般使用 类名::
  Point::f1(p2);
  return 0;
}

程序运行结果:

x=5
y=15
x=10
y=15

对运行结果的分析,最后一次对静态数据成员y更新后,y=15所以两次输出y的值都是15。

只要对静态数据成员的值更新一次,就可以保证所有对象都会存取更新后的值

由本例可知:静态成员函数不能引用本类非静态成员并非绝对,只是不可以进行默认的访问,因为编译器不知道应该去寻找哪一个对象。若必须要访问,则有两种方式,且一般使用第二种居多。

对象名 . 非静态成员 ;

类名 :: 非静态成员 ;

故:实例化对象即可完成对非静态数据成员的访问


相关文章
|
14天前
局部变量和成员变量
局部变量和成员变量 1.定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2.作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类全都可以通用。 3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 1.定义的位置不一样【重点】 局部变量:在方法的内部
22 6
|
1天前
局部变量和成员变量
定义的位置不一样【重点】局部变量:在方法的内部 局部变量和成员变量 1.定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中 2.作用范围不一样【重点】 局部变量:只有方法当中才可以使用,出了方法就不能再用 成员变量:整个类全都可以通用。 3.默认值不一样【重点】 局部变量:没有默认值,如果要想使用,必须手动进行赋值 1.定义的位置不一样【重点】
6 0
|
11月前
|
Java
成员变量与局部变量
成员变量与局部变量
89 0
|
11月前
|
网络协议 API 计算机视觉
Baumer工业相机堡盟工业相机如何设置网口的IP地址(工业相机连接的网口设置IP地址步骤)
Baumer工业相机堡盟工业相机如何设置网口的IP地址(工业相机连接的网口设置IP地址步骤)
135 0
|
监控 负载均衡 网络协议
一文带你浅入浅出Keepalived
一文带你浅入浅出Keepalived
|
存储 测试技术 异构计算
HDL-Bits 刷题记录 01
HDL-Bits 刷题记录 01
335 0
HDL-Bits 刷题记录 01
|
SQL 前端开发 Java
Servlet、SSH、SSM及SpringBoot总结&投票
往期推送分别利用Servlet、SSH、SSM及SpringBoot技术实现了简单的登录、注册、增、删、改、查等功能,并介绍了基本技术原理,目的即是通过简单的Java项目实例对以上技术原理更深入的了解、学习,从而为复杂的系统项目的开发奠定基础以及面试时更能够对JavaWeb技术的把控。
|
5天前
|
人工智能 弹性计算 运维
开启运维新纪元!阿里云OS Copilot深度评测 & 体验分享
OS Copilot是Alibaba Cloud为Linux推出的一款基于大模型的智能助手,它能理解自然语言、辅助命令执行和系统运维。目前仅支持Alibaba Cloud Linux 3的x86_64架构。安装过程涉及线上和本地体验,包括申请试用、配置环境变量、安装组件等步骤。OS Copilot提供命令行和多轮交互模式,能进行代码生成和摘要,辅助开发和运维工作。产品体验评测中,OS Copilot因其自然语言理解和高效辅助得到高度评价,尤其对运维人员来说,能大幅提升工作效率。然而,目前仅限于特定操作系统,是其局限性。未来有望扩展更多功能和支持更多平台。
133097 17
|
3天前
|
存储 SQL 消息中间件
Hologres+Flink企业级实时数仓核心能力介绍
通过Hologres+Flink构建易用、统一的企业级实时数仓。
|
8天前
|
人工智能 弹性计算 API
创意“孵化机”——基于通义万相加速绘画创作流程
阿里云在2023年推出了AI绘画平台**通义万相**,该平台能够根据文本描述生成图像,应用于艺术创作。近期,阿里云优化了通义万相的接入方式,提供API文档和一键部署服务,使得非技术人员也能轻松集成到Web应用中。为促进用户尝试,阿里云还推出了解决方案评测活动,参与者有机会获得奖品。通义万相通过ECS、OSS、VPC和DashScope等云服务支持,简化了技术架构,加速了绘画创作流程。此外,阿里云提供了优惠购买方案,新人享有特别折扣。该服务不仅适用于艺术家,还可应用于多个领域,提高内容生成效率。
70728 20