类的数据成员有两种一是存在在类类型的每个对象中的葡萄成员,还有一个是独立于类的任意对象存在,属于类的,不与类对象关联,这种称为static成员。
对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量
比如统计某种类型对象已创建的数量, 需要一个变量,被该类型的全部对象共享,创建了一个共享,创建了一个就加1,销毁就减1,则需要一个对象被该类型的全体对象共享。
普通的成员变量不能被共享。
共享变量的方法有两种:
1.全局变量
2.类的静态成员
如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量。
这时我们可以用类的成员来解决这个问题
下面用代码说明:
CountObject.h
- # ifndef _COUNTOBJECT_H_
- # define _COUNTOBJECT_H_
- class CountObject
- {
- public:
- CountObject(void);
- ~CountObject(void);
- static int count_;
- };
- # endif
CountObject.cpp
- # include "CountObject.h"
- # include <iostream>
- //静态成员定义说明,此时就不需要加static了
- int CountObject::count_ = 0;
- CountObject::CountObject()
- {
- ++count_;
- }
- CountObject::~CountObject()
- {
- --count_;
- }
main.cpp
- # include "CountObject.h"
- # include <iostream>
- using namespace std;
- int main(void)
- { //静态成员属于类,被所有对象共享
- //因为是公有的所以可以直接访问
- cout << CountObject::count_<<endl;
- CountObject col;
- cout << CountObject::count_<<endl;
- return 0;
- }
运行结果:
对于static成员函数:
1.static成员函数没有this指针
2.非静态成员函数可以访问静态成员
3.静态成员函数不可以访问非静态成员(因为没有this指针,指向某个对象,所以无法访问非静态成员)
下面用代码来说明static成员函数
Test.h
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public:
- Test(int y_);
- ~Test();
- void TestFun();
- static void TestStaticFun();
- public:
- static const int x_ ;
- int y_;
- };
- # endif //_TEST_H_
Test.cpp
- #include "Test.h"
- # include <iostream>
- using namespace std;
- Test::Test(int y):y_(y)
- {
- }
- Test::~Test(void)
- {
- }
- void Test::TestFun()
- { //非静态成员函数可以访问静态成员
- cout<<"x = " << x_<<endl;
- cout<<"This is not a static fun but it can call StaticFun()..." <<endl;
- }
- void Test::TestStaticFun()
- {
- //cout<<"y = "<<y_<<endl; error,static成员函数不能访问非静态成员
- //因为没有this指针,指向某个对象,而y属于某个对象,因为无法访问非静态成员
- // TestFun(); error ,静态成员函数不能调用非静态成员函数
- //因为需要传递this指针,而静态成员函数没有this指针
- }
- const int Test::x_ = 100;
main.cpp
- # include "Test.h"
- # include <iostream>
- using namespace std;
- int main(void)
- {
- cout << Test::x_ <<endl;
- Test t(10);
- t.TestFun();
- cout << t.y_ << endl; //cout << t::x_<<endl; static 不能被对象调用,只能由类调用
- //cout<<t.x<<endl; 不推荐这样使用
- cout <<Test::x_ << endl; //x是属于类的static成员
- return 0;
- }
运行结果: