类静态数据成员是属于类的,不属于某一个对象,因此静态数据并不通过类的构造函数进行初始化。
类中静态成员的初始化方式有两种
一、类外初始化
上代码
#include <iostream>
using namespace std;
class Foo {
public:
static int a;
};
int Foo::a = 10;
void print(int &v) {
cout << v << endl;
}
int main() {
print(Foo::a);
}
类外初始化就显示的在类外重新定义类内静态数据的值。
输出:
PS E:\cppprojection\prac> cd "e:\cppprojection\prac\" ; if ($?) { g++ demo.cpp -std=c++11 -o demo } ; if ($?) { .\demo }
10
尽管可以使用Foo::al类直接访问a的值,但是!!!a的访问权限仍然收到类中访问限定符(public,private)的限制
上代码
#include <iostream>
using namespace std;
class Foo {
private:
static int a;
};
int Foo::a = 10;
int main() {
cout << Foo::a << endl;
}
输出:
demo.cpp: In function 'int main()':
demo.cpp:14:18: error: 'int Foo::a' is private within this context
cout << Foo::a << endl;
^
demo.cpp:10:5: note: declared private here
int Foo::a = 10;
^~~
可见即使是静态成员也受到类访问限定符的限制。
二、类内初始化
#include <iostream>
using namespace std;
class Foo
{
public:
const static int a = 10;
};
void print(const int &b) {
cout << b << endl;
}
int main()
{
print(Foo::a);
}
但是此时如C++ primer中所说:
上述代码的输出结果是:
C:\Users\DELL\AppData\Local\Temp\cceWu1FV.o:demo.cpp:(.rdata$.refptr._ZN3Foo1aE[.refptr._ZN3Foo1aE]+0x0): undefined reference to `Foo::a'
collect2.exe: error: ld returned 1 exit status
也就是说找不到Foo::a的定义,即使a在类中public的定义过,
如果使用类内初始化的话,正确的做法是如C++primer中所说:
其实我觉得是在类外还要重新声明一下
正确做法如下
#include <iostream>
using namespace std;
class Foo
{
public:
const static int a = 10;
};
void print(const int &b)
{
cout << b << endl;
}
const int Foo::a; //增加对a的声明,不能写成const int Foo::a = 10;否则报错重复初始化
int main()
{
print(Foo::a);
}
输出的正确结果为:
PS E:\cppprojection\prac> cd "e:\cppprojection\prac\" ; if ($?) { g++ demo.cpp -std=c++11 -o demo } ; if ($?) { .\demo }
10