当前位置:网站首页>静态成员
静态成员
2022-04-23 05:48:00 【*陌上花开】
为了实现一个类的多个对象之间的数据共享,C++提出了静态成员的概念。
静态成员包括:
静态数据成员和静态成员函数
静态成员的作用:
1.静态成员不属于某一个对象,而属于一个类(属于所有对象),无论建立多少个对象,都共享静态成员——是连接各个对象的桥梁。
2.静态数据成员主要用于各个对象共用数据。如:总数的统计、平均数等。
静态数据成员的定义:
static 数据类型 数据成员名;
class student
{
private:
int num;
char* name;
static float score;
};
静态数据成员可以初始化,但只能在类外进行
格式: 数据类型 类名::静态数据成员 = 初值;
说明:
1)静态数据成员可以说明为公有的、私有的或保护的,说明为公有的可直接通过类名来访问。
类名 ::静态成员名
2)私有或保护静态数据成员只能通过公有成员函数访问。
3)静态成员不同于全局变量——封装在类内部,使用静态数据成员取代全局变量,使数据更为安全;
结论:当在类中需要共享某一数据成员时应定义为静态数据成员。
#include<iostream>
using namespace std;
class box
{
public:
int width; int length;
static int height;
box(int w, int l);
int volume();
};
int box::height = 10;
box::box(int w, int l)
{
width = w;
length = l;
}
int box::volume()
{
return width * length * height;
}
int main()
{
box a(10, 20), b(20, 30);
cout << a.height << endl;
cout << b.height << endl;
cout << a.volume() << endl;
cout << b.volume() << endl;
return 0;
}
静态数据成员的存储:
在所有对象之外单独开辟空间存储,只要在类中定义了静态数据成员,即使不定义任何对象,也为静态数据成员分配空间,它可以在尚未建立对象时通过类名引用。
在类中使用静态数据成员后,只要某一个对象改变了其值,整个类的对象相应的静态数据成员的值均改变。
有效解决办法:
静态成员函数——访问静态数据成员
静态成员函数的定义:
static 返回类型 函数名(参数列表);
{
… };
如: static float averge( )
{return (sum/3) ;}
静态成员函数的调用:
1)静态成员函数属于一个类,可用类名调用。
格式: 类名 :: 静态成员函数名(实参表);
2)静态成员可以用对象调用。
格式 : 对象名 . 静态成员函数名(实参表);
说明:
1)静态成员函数可以在类内部定义,也可在类外定义。
如:类中声明: static float averge();
类外定义: float student::averge( )
{return (sum/3); }
2)静态成员函数无this指针(this指针属于某一对象,静态成员属于令个类),主要用来访问静态数据成员,不能直接访问非静态数据成员,如果要访问非静态数据成员,需加上对象名。
3)普通成员函数可以调用静态成员函数;
4)构造函数和析构函数不能是静态的。
结论:当在类中定义有静态数据成员时,通常应定义静态成员函数来访问静态数据成员。
#include<iostream>
using namespace std;
class student
{
public:
student(int n,string m,float s):num(n),name(m),score(s){}
void total();
static float averge();
private:
int num;
string name;
float score;
static float sum;
};
float student::sum = 0;
void student::total() { sum += score; }
float student::averge() { return (sum / 3); }
int main()
{
student stu[3] = {student(1,"zhangsan",89),student(2,"lisi",85),student(3,"wangwu",75)};
for (int i = 0; i < 3; ++i)
{
stu[i].total();
}
cout << "averge=" << student::averge() << endl;
return 0;
}
版权声明
本文为[*陌上花开]所创,转载请带上原文链接,感谢
https://blog.csdn.net/swint_er/article/details/123456721
边栏推荐
- 多线程爬取马可波罗网供应商数据
- Rust:在线程池中共享变量
- Rust 中的 Cell 共享可变指针
- 批量导出Arcgis属性表
- 【UDS统一诊断服务】四、诊断典型服务(2)— 数据传输功能单元
- [leetcode 228] summary interval
- Qthread simple test understanding
- SQL sorts according to the specified content
- Graduation project, curriculum link, student achievement evaluation system
- Integers have friends interval GCD + double pointer
猜你喜欢
scikit-learn sklearn 0.18 官方文档中文版
ArcGIS license错误-15解决方法
7-21日错题涉及知识点。
gcc ,g++,gdb的安装
安装pyshp库
大学概率论与数理统计知识点详细整理
Export the articles written in CSDN to PDF format
ArcGIS表转EXCEL超出上限转换失败
1007 go running (hdu6808) in the fourth game of 2020 Hangzhou Electric Multi school competition
Dynamic creation and release, assignment and replication of objects
随机推荐
Detailed arrangement of knowledge points of University probability theory and mathematical statistics
Integers have friends interval GCD + double pointer
ArcGIS license错误-15解决方法
Common shortcut keys of IDE
Rust的闭包类型(Fn, FnMut, FnOne的区别)
C#中?的这种形式
Robocode教程7——雷达锁定
C语言输入和输出(printf和scanf函数、putchar和getchar函数)
C array
爬取手游网站游戏详情和评论(MQ+多线程)
基于pygame库编写的五子棋游戏
Addition, deletion, query and modification of data
H. Are You Safe? Convex hull naked problem
数组旋转
Excel打开超大csv格式数据
Qthread simple test understanding
Definition of C class and method
进程间通信的方式
xlsxwriter.exceptions.FileCreateError: [Errno 13] Permission denied问题
爬取彩票数据