经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++对象生存期&&static
来源:cnblogs  作者:回忆酿的甜  时间:2019/1/30 9:42:27  对本文有异议

生存期即从诞生到消失的时间段,在生存期内,对象的值或保持不变,知道改变他的值为止。对象生存期分为静态生存期动态生存期两种。

  • 静态生存期

指对象的生存期与程序运行期相同。在namespace中声明的对象都具有静态生存期。但是,在函数内部作用域中声明具有动态生存期的对象,要用static修饰,如static int a

在局部作用域中,静态变量的特点是不会随函数的每次调用而产生一个副本,同时也不会因为函数的返回而消失。该变量会一直保持上一个值,在每次调用中可共享。同时静态变量在定义时也可以赋值,如static int a = 3;

  • 动态生存期

除上述两种情况,其余为动态生存期。在局部作用域中,有动态生存期的对象,也称为局部生存期对象。局部生存期对象诞生于声明点,结束于声明块执行完毕。在类中不用static修饰的成员,他们的生存期和对象生存期一致。

例:

  1. #include<iostream>
  2. using namespace std;
  3. int i =1;//i全局变量,动态生存期
  4. void Other()
  5. {
  6. static int a = 2;
  7. static int b ;//a,b为静态局部变量,全局寿命,局部可见,第一次进入函数时初始化
  8. int c = 10;//c局部变量,动态生存期,每次进入函数都初始化
  9. a+=2;
  10. i+=32;
  11. c+=5;
  12. cout<<"Other:"<<endl;
  13. cout<<"i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
  14. }
  15. int main()
  16. {
  17. static int a;//静态局部变量,全局寿命,局部可见
  18. int b= -1;
  19. int c = 0;;//b,c局部变量,动态生存期
  20. cout<<"Main:"<<endl;
  21. cout<<"i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
  22. c+=8;
  23. Other();
  24. cout<<"Main:"<<endl;
  25. cout<<"i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
  26. i+=10;
  27. Other();
  28. return 0;
  29. }

  运行结果


 

类的静态成员

类的静态成员是解决同一个类的不同对象之间数据和函数的共享问题的。如每生成一个对象,则计数+1,从而统计一共创建了多少个对象。

  • 静态数据成员

在类的一个属性中,如果某个属性为整个类所共享,则用static修饰为静态成员。该成员在每个类中只有一个副本,由所有对象共同维护,从而实现数据共享。

静态数据成员具有静态生存期,因为静态数据成员不属于任何对象,可通过类名访问,”类名::标识符“。另外,在类定义中,仅进行引用性声明,而在namespace作用域中使用类名限定定义性声明,或初始化。(原因:这样定义是因为这种方式要专门分配空间,非静态数据成员的空间与所属对象空间是同时分配的,所以无须这样定义)。

例:

  1. #include<iostream>
  2. using namespace std;
  3. class Point
  4. {
  5. public:
  6. Point(int x = 0,int y = 0):x(x),y(y)
  7. {
  8. count++;
  9. }
  10. Point(Point &p)//copy
  11. {
  12. x = p.x;
  13. y = p.y;
  14. count++;
  15. }
  16. ~Point()
  17. {
  18. count --;
  19. }
  20. int GetX(){return x;}
  21. int GetY(){return y;}
  22. void ShowCount()//静态函数
  23. {
  24. cout<<"Object count :"<<count<<endl;
  25. }
  26. private:
  27. static int count;//static
  28. int x;
  29. int y;
  30. };
  31.  
  32. int Point:: count = 0;//静态数据成员的初始化,类名限定
  33.  
  34. int main()
  35. {
  36. Point a(4,5);
  37. cout<<"Pont a:"<<"("<<a.GetX()<<","<<a.GetY()<<")"<<endl;
  38. a.ShowCount();//通过对象名
  39. Point b(a);
  40. cout<<"Pont b:"<<"("<<b.GetX()<<","<<b.GetY()<<")"<<endl;
  41. b.ShowCount();
  42. return 0;
  43. }

  运行结果

  • 静态函数成员

在上面例子中,ShowCount()是输出count的值的,而在所有对象声明前,count是==0的,那么如果输出这时的count,该怎么做??所以这时静态函数成员就起作用了。

修改如下:

  1. class Point
  2. {
  3. public:
  4. .
  5. .
  6. .
  7. static void ShowCount()//静态函数
  8. {
  9. cout<<"Object count :"<<count<<endl;
  10. }
  11. private:
  12. ...
  13. };
  14.  
  15. int Point:: count = 0;//静态数据成员的初始化,类名限定
  16. int main()
  17. {
  18. Point::ShowCount();
  19. Point a(4,5);
  20. cout<<"Pont a:"<<"("<<a.GetX()<<","<<a.GetY()<<")"<<endl;
  21. Point::ShowCount();
  22. Point b(a);
  23. cout<<"Pont b:"<<"("<<b.GetX()<<","<<b.GetY()<<")"<<endl;
  24. Point::ShowCount();
  25. return 0;
  26. }

  运行结果

在ShowPoint()函数前加一个static,即变为静态成员函数,它也属于整个类,有所有对象共同拥有,为所有对象共享。静态成员函数可以用过类名|对象名访问,非静态成员函数只能通过对象名调用。

另外,静态成员函数可以直接访问类的静态数据和函数成员,而访问非静态成员,必须通过对象名。所以一般情况下,静态函数用来访问类的静态数据成员

 

原文链接:http://www.cnblogs.com/ygsworld/p/10333366.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号