码迷,mamicode.com
首页 > 其他好文 > 详细

类的静态成员

时间:2015-10-28 17:21:24      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

 
 
问题: 如何统计对象的个数呢?
    (1)普通的成员变量?不行,因为对于普通的成员变量,对象都有个子的成员变量,他们都是相互独立的,所以并不能实现对象个数的统计
    (2)全局变量:可以,但是一般来说,我们都是尽量避免全局变量(周期长,占内存,出错的时候, 不易查找),
    (3)类的静态成员变量和静态成员函数: YES
 
静态成员:
    (1)静态成员是属于整个类所有的,不依赖于任何对象,依赖于类的存在
    (2)可以通过类名来访问 public 的静态成员
    (3)可以通过对象名访问public 的静态成员,
    (4)静态成员不要在类内进行赋值,因为它是被所有该类的对象共享的,一般都是在类外进行初始化;
 
 
静态成员变量:
        其实就是直接接上 static 关键字就可以,静态成员变量不依赖于任何对象,需要在类外单独分配空间;其实就是就存储在全局的数据区(静态存储区域)
 
静态成员函数:
    就是函数名加上 static 关键字,  记住,不要在类内对静态成员变量初始化
  1. class A
  2. {
  3. private:
  4. staticint i;// 静态成员变量
  5. public:
  6. staticint geti()// 静态成员函数
  7. {
  8. return i;
  9. }
  10. void seti(int v)
  11. {
  12. i = v;
  13. }
  14. };
  15. // 不要在类内进行初始化,因为静态成员变量是所有的对象的共有的,
  16. int A::i =10;// 静态成员变量进行初始化
  17. int main()
  18. {
  19. A aa;
  20. aa.seti(10); // 静态成员变量是private,所以只能被类内的函数访问
  21. printf("i = %d\n", aa.geti());// 通过对象进行访问
  22. printf("i = %d\n", A::geti());// 通过类名访问
  23. while(1);
    可以理解为:类的静态成员,是在类内命名空间内部的全局变量,也就是说,今天成员是类内的全局变量,
 
实现对象个数的统计:
  1. class A
  2. {
  3. private:
  4. staticint count;
  5. public:
  6. A()// 构造函数
  7. {
  8. count++;
  9. }
  10. ~A()// 析构函数
  11. {
  12. count--;
  13. }
  14. };
  15. int A::count =0;// 静态成员变量进行初始化
    对象的每次创建,count 就会自加一,对象的销毁的时候,就自减一,所以就完成了对象个数的实现;
    静态成员变量的初始化,一般是在类外进行的,如果没有自己初始化的话,其实是将值静态成员变量默认的初始值就是零了,原因分析:因为静态成员变量是被存储在静态存储区域(全局存储区域)的所有的没有初始化的值,编译器都是自动给他们赋值为零。
 
静态成员函数和普通函数的区别
    (1)关键字 static 的区别,
    (2)静态成员函数实际就是一个类内的全局函数,不依赖于对象,而是依赖于类
  普通的成员函数则是依赖于类内的一个对象,
    (3)静态成员函数只能访问类中的静态成员变量,普通的成员函数则是都可以
    (4)静态成员函数不包含指向具体对象的指针,而普通成员函数包含一个指向具体对象的 this 指针,
 
注意: this指针是编译器自动将对象本身的的地址传递到类内的函数使用,传递给this。this指针的作用域是在类的内部,记住this 指针只有在类的普通成员函数,静态成员函数是绝对没有this 指针,
 
存储空间的分配:
  1. class A
  2. {
  3. private:
  4. int i;
  5. int j;
  6. short a;
  7. short b;
  8. };
  9. class B
  10. {
  11. private:
  12. int i;
  13. int j;
  14. short a;
  15. short b;
  16. staticint c;
  17. };
  18. class C
  19. {
  20. private:
  21. int i;
  22. int j;
  23. short a;
  24. short b;
  25. staticint c;// 全局数据区(静态存储区)
  26. public:
  27. C()// 函数的部分是栈空间
  28. {
  29. }
  30. ~C()
  31. {
  32. }
  33. };
  34. int C::c =10;
    三个类,分配空间的大小, 都是12个字节,原因是静态成员变量不是在对象内进行分配的,而是被分配在全局数据区(静态存储区域),而函数不管是不是静态都是在代码段,
 



类的静态成员

标签:

原文地址:http://www.cnblogs.com/qxj511/p/4917660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!