C++ 静态成员
来源:互联网 发布:mysql数据库汉化版 编辑:程序博客网 时间:2024/05/16 15:00
静态成员的提出是为了解决数据共享的问题。实现共享的办法有很多,如设置全局性的变量或者对象是一种方法。但是,全局变量或者对象是有局限性的。C++为此提出了静态成员,它包括静态数据成员和静态成员函数。
1.静态数据成员
静态数据成员是同一个类中所有对象共享员,而不是某一对象的成员(所以,静态数据成员的初始化必须在类外进行)。使用静态数据成员可以节省内存,因为它是所有对象所共有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样的,但它的值是可以更新的。与静态变量相似,静态数据成员是静态存储的,具有静态生存期。但定义一个静态数据成员与一般静态变量不一样,它是这样定义的:
(1)使用关键字static 声明静态数据成员。
(2)对静态数据成员进行初始化。由于静态数据成员要实际分配空间,因此,不能在类声明中进行初始化。静态数据成员初始化必须在类的外部进行。格式如下:
<数据类型><类名>::<静态数据成员> = <值> 比如:int CPoint::x = 0;
例:静态数据成员的使用
#include <iostream>using namespace std;class CSum{public: CSum() {} //无参数构造函数 CSum(int a,int b) //构造函数{nsum+=a+b;}CSum(const CSum &tmp) //复制构造函数(拷贝构造函数){cout<<"调用拷贝构造函数"<<endl;cout<<tmp.nsum<<endl;}~CSum() {} //析构函数int GetSum();void SetSum(int nsum);private:static int nsum;};int CSum::GetSum(){return nsum;}void CSum::SetSum(int n){nsum = n;}//CSum::CSum() {} //无参构造函数的实现//CSum::~CSum() {} //析构函数的实现 int CSum::nsum = 0; //静态数据成员必须在类外进行初始化void main(){CSum two;cout<<"sum="<<two.GetSum()<<endl;CSum one(10,2);cout<<"sum="<<one.GetSum()<<endl;CSum three(one); //调用拷贝构造函数初始化cout<<"sum(three)="<<three.GetSum()<<endl;one.SetSum(5);cout<<"sum(one)="<<one.GetSum()<<endl;cout<<"sum(two)="<<two.GetSum()<<endl;cout<<"sum(three)="<<three.GetSum()<<endl;}
由显示结果可知,所有的CSum类对象共享静态数据成员 nsum;当一个对象改变了静态数据成员nsum的值后,所有的CSum类的对象的nsum值跟着发生变化。
2.静态成员函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,都不是对象成员。因此,对静态成员的引用不需要用对象名。
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数要引用非静态成员(包括数据成员和成员函数),可以通过对象来引用。通过下面的例子来说明这一点。
例:静态成员函数的引用。
#include <iostream>using namespace std;class CSum{public:CSum(int a=0,int b=0) //带参数的构造函数{nsum += a+b;} CSum() //重载无参数的构造函数{}int GetSum(){return nsum;}void SetSum(int n){nsum = n;}static void ShowData(CSum one); //声明静态成员函数(静态成员函数必须在类外实现)~CSum() //析构函数{}private:static int nsum;};void CSum::ShowData(CSum one) //静态成员函数的实现(注意:一定要在类外实现){cout<<"静态成员函数直接使用类的静态数据成员"<<endl;cout<<"sum="<<nsum<<endl;cout<<"静态成员函数通过使用类的对象调用类的非静态成员"<<endl;cout<<"sum="<<one.GetSum()<<endl;}int CSum::nsum = 0; //静态数据成员的初始化(注意:一定要在类外实现)void main(){CSum one(10,2);CSum::ShowData(one); //通过类名直接访问one.SetSum(8);one.ShowData(one); //共有的静态成员函数也可以通过相应的对象访问。}
从例中可以发现,共有的静态成员函数既可以通过相应的对象访问(这一点与一般成员函数相同),也可以通过所属的类名来引用。
- C++_静态成员
- C++_静态成员
- C++_静态成员
- C++【静态成员】
- [C++] 静态成员函数
- C++-静态成员
- C++---静态成员
- c++--静态成员变量
- C++:静态成员与常成员
- C#—静态成员和实例成员
- C++static静态数据成员
- C++static静态成员函数
- C++---类中的静态成员
- 【C++】静态成员函数小结
- C++:静态类成员函数
- 【C++】类的静态成员
- C++——静态成员
- C/C++静态成员变量和静态成员函数
- 资源分享
- Veritas Netbackup 6.0的日志位置和查看方式
- 介绍 Windows Presentation Foundation 3D
- 飞过海大风过后飞过海发动反攻恢复搞活风电规划法规和
- hdfs-webdev
- C++ 静态成员
- 微信自定义菜单的创建(微信账号绑定功能的实现 Java)
- Wooden Sticks--贪心
- Linux命令简介(文件/目录权限操作命令)
- Ubuntu下Gradle离线安装
- 【裸机开发笔记】6410的系统时钟设置(上)---6410时钟控制逻辑框架分
- ASP.NET中FileUpload控件上传图片时等比例缩放,然后保存到数据库
- DSP烧毁原因
- jquery遍历ul注册click事件