用初始化列表初始化变量的小问题
#include <iostream>
using namespace std;
int s=0;
class sample
{
static int n;
public:
sample(int i){n=i;}
static void add(){s+=n;}
};
int sample::n=0;
void main()
{
sample a(2),b(5);
sample::add();
cout<<"s="<<s<<endl;
}
为什么我把程序中的sample(int i){n=i;}改为用初始化列表sample(int i):n(i){}来初始化n时,编绎器报错说:cannot initialize static class data via constructor呢?
问题点数:20、回复次数:9Top
1 楼kylix2003(Jelly)回复于 2005-03-17 21:54:10 得分 4
static int n;
类的静态成员变量是需要放在类外部初始化的。
Top
2 楼CMyMfc(星际人生:=E.F=FlyForEver)回复于 2005-03-17 21:55:54 得分 2
int sample::n;
既然你想每个类构造的时候给它赋值, 为何要设成static呢Top
3 楼yliang(风之悄语)回复于 2005-03-17 21:58:18 得分 1
我这儿没问题,vc++7.1(vs.net2003)通过,s=5Top
4 楼kobefly(科比--网络学习中)回复于 2005-03-17 22:00:04 得分 3
静态类成员变量的初始化比较特殊
是必须在类外初始化的
因为静态成员不属于某个对象
而是属于整个类的
对立于类而存在的Top
5 楼yc0188(守护瓶(萍))回复于 2005-03-17 22:11:54 得分 2
int sample::n;
这样就可以了!Top
6 楼jxliang()回复于 2005-03-17 22:13:29 得分 0
可能有个别的人误会我的意思了.我在上面给出的程序是可以运行的,但把程序中的sample(int i){n=i;}改为sample(int i):n(i){}后,编绎器就不能通过了,是不是有点奇怪呢?Top
7 楼yliang(风之悄语)回复于 2005-03-17 23:44:27 得分 4
设有:
class A
{
};
class B1
{
public:
B1(const A &_a):a(_a)//直接初始化
{
}
A a;
};
class B2
{
public:
B2(const A &_a)
{
a=_a;//这里的a是在B2的B2(const A &_a)执行之前调用A的构造函数初始化,然后在B2(const A &_a)里面将_a赋给a的
}
A a;
};
BJ的原话:
The members' constructor are called before the body of containing class' own constructor is executed.
Top
8 楼GeminiXXXCC(吕布)回复于 2005-03-17 23:55:19 得分 0
static int n;
类的静态成员变量是需要放在类定义的外部进行定初始化的。
^_^Top
9 楼yliang(风之悄语)回复于 2005-03-18 00:42:34 得分 4
又,《Effective C++》提到:
Static data members act like global and namespace objects, so they are initialized only once。
所以编译器为了避免多次initialize(初始化)静态成员,在类的初始化列表中不允许出现静态成员的初始化,但在后面的大括号里面却是可以的。Top




