静态数据成员(C++)

article/2025/5/11 13:46:53

目录

一、静态数据成员

1.1、定义

1.2、声明

1.3、初始化

1.4、普通访问

1.5、对象访问

二、静态成员函数


一、静态数据成员

1.1、定义

我们都知道,类是对具有相同属性和相同行为的一组对象的描述。

有时侯,我们希望每定义一个对象,调用一次构造函数,其中有一些数据成员被所有对象共享,但是我们知道,类中的数据成员是每个对象所私有的,那么我们该如何使用一个数据让所有对象共享它呢?一个办法是将其定义为全局变量,这样就可以达到让多个数据对象共享的目的,但是全局变量的引入会带来不安全性,并且破坏了面向对象程序设计的信息隐蔽技术,与面向对象的封装性特点是矛盾的。为了实现同一个类中多个对象之间的数据共享,C++提出了静态数据成员的概念。

1.2、声明

在一个类中,若将一个数据成员说明为static,这种成员成为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据成员的拷贝,从而实现了一个类的不同对象之间的数据共享。

定义静态数据成员的格式如下:(我们以classA为例,以下都是)

static 数据类型 数据成员名;

static int x;

1.3、初始化

注意:静态数据成员的初始化与普通数据成员的初始化不同,静态数据成员的初始化应在类外单独进行,并且应在定义对象之前进行。一般在主函数main之前。类声明之后的特殊地带为它提供定义和初始化,初始化格式如下:

数据类型 类名::静态数据成员名=初始化值;注意这里不要加static关键字。

int classA::x=0;

1.4、普通访问

静态数据成员属于类,(准确的说是属于类对象的集合)而不像某一个数据成员那样属于一个对象,因此可以使用"类名::",访问静态数据成员,用类名访问静态数据成员的格式如下:

类名::静态数据成员名

cout<<classA::x<<endl;

1.5、对象访问

静态数据成员与静态变量一样,是在编译时创建并初始化,它在该类的任何对象创建前就存在。因此共有的静态数据成员可以在对象创建之前被访问,对象定义后,公有的静态数据成员,也可以通过对象进行访问,访问格式如下:

对象名.静态数据成员名;

对象指针->静态数据成员名;

classA A;
A.x;
A->x;

注意:私有的静态数据成员不能在类外直接访问,必须通过公有的成员函数访问。

class A {
private:int x;int y;int h;static int z;
public:A(int a,int b);~A();void show1();void show2();static void  print();
};
A::A(int a,int b) {x = a;y = b;h = a + b;++z;
}
A::~A() {}
void A::show1() {cout <<"x = "<< x << endl;cout <<"y = "<< y << endl;cout << "h= " << h << endl;
}
void A::show2() {cout << "次数为 "<<z << endl;//cout << "次数为  " << A::z << endl;//两种访问方式都可以
}
int A::z = 0;
int main() {A a(2, 2);a.show1();a.show2();A b(2, 3);A* p;p = &b;p->show1();(*p).show2();b.show1();b.show2();return 0;
}

测试用例:

 

二、静态成员函数

在类的定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不是属于类中的某个对象。定义静态成员函数的格式如下:

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

与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:

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

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

对象->静态成员函数名(参数表);

例:

static  int  fun(int a,int b);classA::fun(int a,int b);classA A;
A.fun(int a,int b);
A->fun(int a,int b);

静态数据成员函数与非静态成员函数的重要区别是:非静态成员函数有this指针,而静态成员函数没有this指针。静态成员函数可以直接访问本类的静态数据成员,因为静态数据成员同样是属于类,可以直接访问。一般而言,静态成员函数不能访问类中的非静态数据成员,若确实需要访问非静态数据成员,静态成员函数只能通过对象名(对象指针或对象引用)访问该对象的非静态数据成员。例如:

class A {
private:int x;static int y;
public:A(int a);~A();void print();static void fun(A& a);static void fun1(A* p);static void show();
};
A::A(int a) {x = a;y++;
}
A::~A(){}
void A::print() {//普通成员函数调普通数据成员与静态数据成员cout << "x= " <<x<< endl;cout << "y= " <<y<< endl;
}
void A::fun(A& a) {//静态成员函数调普通数据成员cout << "x1= " << a.x << endl;
}
void A::fun1(A* p) {//这里指针方式就演示这一个哈cout << "x2= " << p->x<< endl;
}
void A::show() {//静态成员函数调静态数据成员cout <<"次数为y= "<< y << endl;
}
int A::y = 0;
int main() {A a(1), b(2), c(3);A* p;p = &a;a.print();b.print();c.print();A::fun1(&a);A::fun1(p);p->fun1(&a);p->fun1(p);(*p).fun1(&a);A::fun(a);A::fun(b);A::fun(c);A::show();return 0;
}

这里提供了多种调用方式,测试用例:

 


http://chatgpt.dhexx.cn/article/bR0kyg80.shtml

相关文章

C语言文件 open函数和fopen函数

open 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>定义函数&#xff1a; int open(const char * pathname, int flags); int open(const char * pathname, int flags, mode_t mode);函数说明&#xff1a; 参数1…

VS中fopen_s函数的用法(fopen函数的扩展)

使用方法&#xff1a; 首先看fopen的代码&#xff1a; FILE* fp null; fp fopen(filename,"w") if(fp!null) { // 打开文件成功 }再来看fopen_s的用法&#xff1a; FILE* fp null; errno_t err 0; err fopen_s(&fp,filename,"w") if(err0) { /…

Vxworks或Workbench编译环境下fopen函数的用法

Vmware虚拟机下建立了Vxwork操作系统&#xff0c;Workbench连接对应的Vxworks操作系统进行编程&#xff0c;在此环境下进行编译c或者c语言过程中&#xff0c;用fopen或fprintf将变量输出至文件&#xff0c;过程中要注意的是&#xff0c;此时的Vxworks操作系统没有与Windows的c、…

fopen()函数的使用方法

语法&#xff1a; FILE *fopen(const char *filename, const char *mode); 返回值&#xff1a; fopen函数返回新打开文件的文件指针&#xff1b; 如果此文件不能打开&#xff0c;则返回NULL指针。 表格清晰可见&#xff1a; 模式描述文件可否存在"r"打开文件仅供…

c语言中fopen的作用,c语言fopen函数的用法

在c语言中可以使用“fopen()”函数打开一个文件&#xff0c;该函数用于打开一个文件&#xff0c;其语法是“open("file a","r");”&#xff0c;其参数r表示只读属性。 fopen函数是打开一个文件&#xff0c;其调用的一般形式为&#xff1a; 文件指针名fopen…

fopen函数的用法示例_在C和C ++中使用fopen()函数的用法以及示例

fopen函数的用法示例 In C and C++ programming languages fopen() function is used to open files and make operations like add, update, create for data. In this tutorial we will learn the syntax, usage and errors about the fopen() function. 在C和C ++编程语言中…

php fopen函数php,fopen函数介绍与使用方法详解

在我们的PHP开发中会经常遇到fopen()和file_get_contents(),相信很多同学都发现这两个函数基本上都差不多,那么我们今天就来讲讲php fopen()和file_get_contents()的区别到底再哪,废话少说了,一起来看看吧!php中读取文件可以使用fopen和file_get_contents这两个函数,二者之…

php fopen函数php,php fopen函数用法(打开创建文件)_PHP教程 - fopen

php教程 fopen函数用法(打开创建文件) 在很多时间我们都需要创建文件特别是生成静态页面的时间,我们在php中就常常会用到fopen这个函数来新建文件,它的原是是如何文件存在就追加,不存在可以创建,下面来了很多参数... php教程 fopen函数用法(打开创建文件) 在很多时间我们都…

C语言fopen函数的用法

在C语言中&#xff0c;操作文件之前必须先打开文件&#xff1b;所谓“打开文件”&#xff0c;就是让程序和文件建立连接的过程。 打开文件之后&#xff0c;程序可以得到文件的相关信息&#xff0c;例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中&#xff0…

《java核心技术卷I》

《java核心技术卷I》java老师讲课的内容PPT代码基本是来自于这里&#xff0c;感觉还不错&#xff0c;里面的代码也是循序渐进的。 这本书本身也是老师开始讲课时推荐的或者说参考的书的第一本。

java核心技术卷1学习思维导图

java核心技术卷1学习思维导图 java核心技术卷&#xff11;学习java基础 java对象与类基础知识 面向对象java 继承 面向对象java 接口和内部类 异常、日志、断言和调试 泛型程序设计 集合

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(6) 静态代理

6.5 代理 啥是代理&#xff1f;代理人就是替你办事的那个人。比如点了外卖&#xff0c;外卖小哥就是你取餐的代理人。代理除了能完成既定任务&#xff0c;还可以完成额外任务。比如&#xff0c;你留言让他给你带瓶可乐。代理类就是替一个类完成委托地另一个类。 6.5.1 静态代理…

新书推荐 | Java核心技术卷Ⅰ:基础知识(原书第11版)

新书推荐 《Java核心技术卷Ⅰ&#xff1a;基础知识&#xff08;原书第11版&#xff09;》 长按二维码了解及购买 全新第11版&#xff01;针对Java SE9、10、11全面更新&#xff01;Java领域极具影响力和价值的著作之一&#xff0c;与《Java编程思想》齐名&#xff0c;10余年全球…

【Java核心技术卷】谈谈对Java平台的理解

专题 | 谈谈对Java平台的理解 2019年4月24日下午 沉晓 学Java已经快两个月了,结果被问到 "你能给我解释一下什么是Java平台吗?" 结果支支吾吾地说了一大堆,却毫无逻辑可言,感觉超级失败 我觉得很有必要重新谈谈我对Java平台的认识,帮我理清逻辑的同时,希望能够…

对《Java核心技术卷一》读者的一些建议

思想不会变&#xff0c;所以《Java编程思想》还停留在第 4 版&#xff08;2007 年&#xff09;&#xff1b;而技术是要更新迭代的&#xff0c;所以《Java核心技术卷一》来到了第十版&#xff08;2016 年&#xff09;。 我们来看一下《Java核心技术卷一》第十版的大纲。 前九章…

Java核心技术卷1基础知识课程-专题视频课程

Java核心技术卷1基础知识课程—2人已学习 课程介绍 Java核心技术入门视频培训课程&#xff1a;该教程系统全面讲解Java语言的核心概念&#xff0c;语法&#xff0c;重要特性和开发方法&#xff0c;讲解Java开发工具跟编程思想、用Java开发具体的系统程序&#xff0c;让…

Java核心技术卷II:高级特性

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用&#xff0c;下载后请24小时内删除&#xff0c;支持正版&#xff0c;喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”)购买正版 封页 内容简介 本书是Java领域有影响力和价值的著作之…

# java 核心技术卷1 (原书第11版)通读 第一章:java的基本程序设计结构

前言&#xff1a; 我是一名前端开发人员&#xff0c;因为想自学java&#xff0c;根据网络上的推荐顺序&#xff0c;决定从呼声最高的 java 核心卷 11版 读起&#xff08;PS:其实12版已经出来了&#xff0c;但是只有实体书&#xff0c;没有电子版呀。实体书太贵了&#xff0c;7…

Java核心技术卷1:基础知识(原书第10版)

本书为专业程序员解决实际问题而写&#xff0c;Java基础知识面覆盖很完整&#xff0c;可以帮助你深入了解Java语言和库。在卷I中&#xff0c;Horstmann主要强调基本语言概念和现代用户界面编程基础&#xff0c;深入介绍了从Java面向对象编程到泛型、集合、lambda表达式、Swing …