博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++static成员函数和static成员的学习
阅读量:6680 次
发布时间:2019-06-25

本文共 1972 字,大约阅读时间需要 6 分钟。

    类的数据成员有两种一是存在在类类型的每个对象中的葡萄成员,还有一个是独立于类的任意对象存在,属于类的,不与类对象关联,这种称为static成员。

    对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量

    比如统计某种类型对象已创建的数量, 需要一个变量,被该类型的全部对象共享,创建了一个共享,创建了一个就加1,销毁就减1,则需要一个对象被该类型的全体对象共享。
    普通的成员变量不能被共享。
    共享变量的方法有两种:
      1.全局变量
      2.类的静态成员
    如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量。
    这时我们可以用类的成员来解决这个问题
 
下面用代码说明:
 
CountObject.h
 
 
 
  1. # ifndef _COUNTOBJECT_H_ 
  2. # define _COUNTOBJECT_H_ 
  3.  
  4. class CountObject 
  5. public
  6.     CountObject(void); 
  7.  
  8.     ~CountObject(void); 
  9.  
  10.     static int count_; 
  11. }; 
  12. # endif  
CountObject.cpp
 
 
 
  1. # include "CountObject.h" 
  2. # include <iostream> 
  3. //静态成员定义说明,此时就不需要加static了 
  4. int CountObject::count_ = 0; 
  5.  
  6. CountObject::CountObject() 
  7.     ++count_; 
  8. CountObject::~CountObject() 
  9.     --count_; 
 
main.cpp
 
 
  1. # include "CountObject.h" 
  2. # include <iostream> 
  3. using namespace std; 
  4.  
  5. int main(void
  6. {  //静态成员属于类,被所有对象共享 
  7.     //因为是公有的所以可以直接访问 
  8.     cout << CountObject::count_<<endl; 
  9.  
  10.     CountObject col; 
  11.  
  12.     cout << CountObject::count_<<endl;   
  13.      
  14.     return 0; 
 
 
运行结果:

 
    对于static成员函数:
      1.static成员函数没有this指针
      2.非静态成员函数可以访问静态成员
      3.静态成员函数不可以访问非静态成员(因为没有this指针,指向某个对象,所以无法访问非静态成员)
 
 下面用代码来说明static成员函数
Test.h
 
 
  1. # ifndef _TEST_H_ 
  2. # define _TEST_H_ 
  3.  
  4. class Test 
  5. public
  6.     Test(int y_); 
  7.     ~Test(); 
  8.     void TestFun(); 
  9.     static void TestStaticFun(); 
  10.  
  11. public
  12.     static const int x_ ; 
  13.     int y_; 
  14. }; 
  15.  
  16. # endif //_TEST_H_ 
Test.cpp
 
  1. #include "Test.h" 
  2. # include <iostream> 
  3. using namespace std; 
  4.  
  5. Test::Test(int y):y_(y) 
  6.  
  7.  
  8. Test::~Test(void
  9.  
  10. void Test::TestFun() 
  11. {
    //非静态成员函数可以访问静态成员 
  12.     cout<<"x = " << x_<<endl; 
  13.     cout<<"This is not a static fun but it can call StaticFun()..." <<endl; 
  14. void Test::TestStaticFun() 
  15.       //cout<<"y = "<<y_<<endl; error,static成员函数不能访问非静态成员 
  16.  
  17. //因为没有this指针,指向某个对象,而y属于某个对象,因为无法访问非静态成员 
  18.      // TestFun(); error ,静态成员函数不能调用非静态成员函数 
  19. //因为需要传递this指针,而静态成员函数没有this指针  
  20.  
  21. const int Test::x_ = 100; 
 
 main.cpp
 
 
  1. # include "Test.h" 
  2. # include <iostream> 
  3. using namespace std; 
  4.  
  5. int main(void
  6.     cout << Test::x_ <<endl; 
  7.     Test t(10); 
  8.  
  9.     t.TestFun(); 
  10. cout << t.y_ << endl; //cout << t::x_<<endl; static 不能被对象调用,只能由类调用     
  11.  
  12.     //cout<<t.x<<endl; 不推荐这样使用 
  13.     cout <<Test::x_ << endl; //x是属于类的static成员 
  14.      
  15.     return 0;    
运行结果:
 
 

转载地址:http://vznao.baihongyu.com/

你可能感兴趣的文章
SD卡路径问题以及如何获取SDCard 内存
查看>>
程序员面试笔试宝典学习记录(七)(海量数据相关知识)
查看>>
公租自行车-北京经济技术开发区
查看>>
Android面试,IntentService的原理及使用
查看>>
IIS下浏览指定文件(如:web.config)
查看>>
[深入浅出WP8.1(Runtime)]应用实例——移动截图
查看>>
hdu 4770(枚举 + dfs爆搜)
查看>>
iPhone 6 首发无大陆,DevStore要去香港吗?
查看>>
理解class.forName()
查看>>
web系统架构的演进变化很形象
查看>>
Linux curses库使用
查看>>
第42周三
查看>>
一致性hash和solr千万级数据分布式搜索引擎中的应用
查看>>
Python数据结构与算法--算法分析
查看>>
IT职场求生法则(转)
查看>>
Load Average
查看>>
Oracle----Operator
查看>>
反编译工具 jad
查看>>
【MyBean调试笔记】接口的使用和清理
查看>>
iOS开发手记-iOS8中使用定位服务解决方案
查看>>