因为s_nvalue是一个静态成员变量,s_nvalue是类的所有对象之间共享。因此,cfirst.s_nvalue是csecond.s_nvalue相同。上述计划表明,我们使用录音的价值可使用csecond!
虽然你可以通过类类型的对象访问静态成员,这有点误导。cfirst.s_nvalue意味着s_nvalue属于录音,这是真的不是这样的。s_nvalue不属于任何对象。事实上,s_nvalue存在,即使没有类的对象已经初始化!
因此,认为它是更好的静态成员属于类本身,而不是类的对象。因为s_nvalue独立存在的任何类的对象,它可以使用类的名称和作用域操作符直接访问:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class
Something
{
public
:
static
int
s_nValue;
};
int
Something::s_nValue = 1;
int
main()
{
Something::s_nValue = 2;
std::cout << Something::s_nValue;
return
0
|
在上面的代码片段中,s_nvalue引用类的名字而不是通过对象。值得注意的是,我们甚至没有实例化的对象类型的东西,但我们仍然能够访问和使用的东西::s_nvalue。这是用于访问静态成员的首选方法。
初始化静态成员变量
由于静态成员变量不是单个对象的一部分,你必须明确地定义静态成员,如果你想将它初始化为非零值。下面的线,在上面的例子中初始化静态成员1:
这个初始化器应放置在代码文件的类(某事。CPP)。在初始化线没有,C++将初始化值0。
静态成员变量的一个例子
为什么使用静态变量在类?一个很好的例子是分配一个唯一的标识,该类的每个实例。这是一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class
Something
{
private
:
static
int
s_nIDGenerator;
int
m_nID;
public
:
Something() { m_nID = s_nIDGenerator++; }
int
GetID()
const
{
return
m_nID; }
};
int
Something::s_nIDGenerator = 1;
int
main()
{
Something cFirst;
Something cSecond;
Something cThird;
using
namespace
std;
cout << cFirst.GetID() << endl;
cout << cSecond.GetID() << endl;
cout << cThird.GetID() << endl;
return
0;
}
|