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