C++中类静态数据成员的理解

类静态数据成员是属于类的,不属于某一个对象,因此静态数据并不通过类的构造函数进行初始化。

类中静态成员的初始化方式有两种

一、类外初始化

上代码

#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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值