读书人

类中静态成员初始化的有关问题?

发布时间: 2013-11-25 13:22:27 作者: rapoo

类中静态成员初始化的问题???


class string
{
private:
char *str;
int len;
static int num; //3
static const int LIMIT=100; //4
public:
}

在类中不能初始化静态成员变量,可是第四行为啥就可以???
[解决办法]
因为一般class的申明都是放在头文件中的,如果允许类的静态变量的就地初始化(像你上述代码中的第三行就属于就地初始化),相当于在该头文件中定义一个非const变量,而变量默认的属性是外部链接,如果该头文件被多个文件包含,那么,这些文件的导出符号表中就会出现这个变量的导出符号,所以编译的时候会报错(多重定义了),所以C++不允许类的static静态变量的就地初始化,大概就是这样的,LZ可以去看下关于编译链接过程的知识,就清楚为什么要这么设计的了
[解决办法]

//可做如下测试。
#include <iostream>
class A
{
public:
static const int a = 10;
};

//const int A::a;

int main()
{
std::cout << &A::a << std::endl; //无法编译通过,会显示“undefined reference to A::a 的错误”
}
//上面的程序如果改成:
#include <iostream>
class A
{
public:
static const int a = 10;
};

const int A::a;

int main()
{
std::cout << &A::a << std::endl; //则编译,链接正常,并输出相应的地址值
}

读书人网 >C++

热点推荐