[C++] 类的静态成员 (静态数据成员 和 静态成员函数)

article/2025/5/11 11:56:20

目录

一、声明静态成员:

二、定义静态成员:

三、使用类的静态成员:

四、静态成员类内初始化:

五、静态成员与普通成员的区别:

六、案例代码:


类内的静态成员包括: 静态数据成员 和 静态成员函数

类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。

一、声明静态成员:

成员(函数 或 变量 )声明之前加上关键字 static。 

静态成员可以是 public 或 private的。 

静态数据成员的 类型 可以是 常量、引用、指针、类类型

class Account
{
public:Account(std::string name, double mount):owner(name),amount(mount){ }void calculate() {amount += amount * interestRate;std::cout << amount << std::endl;}//获取当前利率static double rate(){return interestRate;}//用于更新ratestatic void rate(double);private:std::string owner;double amount;static double interestRate;static double initRate();
};

上面例子中的静态成员有:

static double rate();static void rate(double);static double interestRate;static double initRate();

说明:

1. 每个Account对象将包含两个数据成员:owner 和 amount 。 只存在一个interestRate对象而且它被所有Account对象共享。

2. 静态成员函数,不与任何对象绑定在一起,它们不包含this指针,不能在static函数体内使用this指针。

3. 作为结果,静态成员函数不能声明成 const的。

二、定义静态成员:

1. 静态成员函数:

像其他成员函数一样,既可以在类的内部 ,也可以在类的外部定义静态成员函数。 

在类的外部定义静态成员函数时,不能重复static关键字,该关键字只出现在类内部的声明语句

比如,上面定义的Account类中的rate函数,在类外的定义如下:

//在类外定义,静态成员函数,不包含 static关键字void Account::rate(double a)
{interestRate = a;
}

2. 静态数据成员:

静态数据成员,不是在创建类的对象时被定义的,它们不是由类的构造函数初始化的。(比如:上面定义的Account类中的静态数据成员 interestRate)

不能在类的内部初始化静态成员,必须在类的外部定义 和 初始化每个静态成员 。 一个静态数据成员只能定义一次。 

类似于全局变量,静态数据成员定义在任何函数之外。 因此一旦被定义,就将一直存在于程序的整个生命周期中。

//定义并初始化一个静态成员
double Account::interestRate = initRate();

【定义了名为 interestRate对象,该对象是 类Account的静态成员, 其类型是double。 从类名开始,这条语的剩余部分就都位于类的作用域之内了,因此可以直接调用initRate函数。】

三、使用类的静态成员:

使用作用域运算符直接访问静态成员:

double current_rate;
// 通过 域运算符,调用rate()函数,获取当前的利率
current_rate= Account::rate();Account ac1;
Account* ac2 = &ac1;//通过对象(指针),调用rate()函数,获取当前的利率
current_rate = ac1.rate();
current_rate = ac2->rate();

静态成员 不属于类的某个对象,但 仍可以使用 类的对象、引用 或 指针 来访问静态成员。

四、静态成员类内初始化:

虽然类的 静态成员 不应该在类的内部初始化, 但是,C++中可以为 字面值常量类型 constexpr 的静态成员 提供 const 整数类型(只是 整数类型)的类内初始值。初始值 必须 常量表达式。 

class Account
{
public:....
private:static constexpr int period = 100;double daily_table[period];
}

五、静态成员与普通成员的区别:

静态成员独立于对象, 而 普通成员是和具体的对象关联的。

区别一:

静态成员可以是不完全类型。   特别的,静态数据成员的类型可以是它所属的类类型; 而非静态数据成员则受到限制,只能声明成 它所属累的指针或引用:

class Bar
{
public:.....
private:static Bar mem1;Bar* mem2; //正确:指针成员可以是不完全类型Bar mem3; //错误:数据成员必须是完全类型
}

区别二:

可以使用静态成员作为 默认实参

class Screen
{
public://bkground表示一个在类中稍后定义的静态成员Screen& clear(char = bkground);private:static const char bkground;
}

六、案例代码:

有的时候类需要它的一些成员与类本身直接相关 , 而不是与类的各个对象关联。 例如,一个银行的账户类中有一个数据成员来表示当前的基准利率,每个类的对象都能够使用该基准利率,并且一旦利率浮动,所有的对象都能使用新值。

staitc_content.h 头文件如下:

#ifndef _STATIC_CONTENT_H
#define _STATIC_CONTENT_H
#include<string>class Account
{
public:Account(std::string name, double mount):owner(name),amount(mount){ }void calculate() {amount += amount * interestRate;std::cout << amount << std::endl;}static double rate(){return interestRate;}//用于更新ratestatic void rate(double);private:std::string owner;double amount;static double interestRate;static double initRate();
};
//定义并初始化一个静态成员
//静态成员,并不属于某一个类的对象,而是属于类
//因为从类名 Account后面开始,剩余的部分都位于类的作用域之内,因此可以直接使用initRate函数
double Account::interestRate = initRate();void Account::rate(double a)
{interestRate = a;
}double Account::initRate()
{return 0.0;
}#endif

static_content.cpp 代码如下:

#include <iostream>
#include"static_content.h"int main()
{Account my("my",100);std::cout << my.rate() << std::endl;//变更利率my.rate(6.7);std::cout << "my的利率 " << my.rate() << std::endl;Account Xiaohui("Xiao Hui",200);std::cout << "Xiao hui的利率 "<<Xiaohui.rate() << std::endl;
}

代码执行的结果如下:

 


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

相关文章

对静态数据成员进行初始化

1.如果希望同类的各个对象中的数据成员的值是一样的&#xff0c;就可以把它定义为静态数据成员。 2.静态数据成员是在编译时预留空间的&#xff0c;在程序开始运行时被分配空间&#xff0c;到程序结束才释放空间。 3.静态数据成员可以初始化&#xff0c;但只能在类体外进行初…

静态数据成员与非静态数据成员的区别

数据成员&#xff1a; 静态数据成员是类的一部分&#xff0c;为类的所有实例共享(静态区)&#xff1b; 非静态数据成员&#xff0c;类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问&#xff1a; 静态数据成员是类的一部分&#xff0c;在产生任何实例之前已经存在&a…

静态数据成员和静态数据成员函数

c中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西&#xff0c;好像也是找工作公司面试中常常问到的东西。我自己也深有体会&#xff0c;在学习c的过程中&#xff0c;总感觉static很烦人&#xff0c;但是又是一个必须懂的东西&#xff0c;所以今天就对静态数据…

静态数据成员(C++)

目录 一、静态数据成员 1.1、定义 1.2、声明 1.3、初始化 1.4、普通访问 1.5、对象访问 二、静态成员函数 一、静态数据成员 1.1、定义 我们都知道&#xff0c;类是对具有相同属性和相同行为的一组对象的描述。 有时侯&#xff0c;我们希望每定义一个对象&#xff0c…

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核心技术卷一》第十版的大纲。 前九章…