静态成员数组可以在声明时不指定大小吗?

飞翔的土豆 2010-02-03 06:08:16
看深入浅出MFC中讲消息映射那段有这么一段代码

class CView:public CWnd
{
public:
...
static AFX_MSGMAP_ENTRY _messageEntries[];
static AFX_MSGMAP messageMap;
virtual AFX_MSGMAP* GetMessageMap() const;
};

其中的静态成员数组为何不指定大小就可以通过编译呢?
...全文
487 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
耍宝王 2010-02-03
  • 打赏
  • 举报
回复
C++ Primer 上说static const 数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义
飞翔的土豆 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pgplay 的回复:]
C/C++ codeclass A
{staticconstint n=100;
};constint A::n;//我记得还要加一句
[/Quote]

在看effective c++时里面有说过这样的语法。貌似梅耶说有些旧的编译器不太支持static const成员,所以语法很别扭~~
mstlq 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pgplay 的回复:]
C/C++ codeclass A
{staticconstint n=100;
};constint A::n;//我记得还要加一句
[/Quote]

这个代码,在VC6/7/8/9/10都是会挂的……
两种方式

class A
{
static const int n;
};
const int A::n=100



class A
{
static const int n=100;
};
飞翔的土豆 2010-02-03
  • 打赏
  • 举报
回复
感谢LS各位的答复!长知识了~~~
晨星 2010-02-03
  • 打赏
  • 举报
回复
VC6太老了,想当年微软开始做VC6的时候,偶才不满20岁呢,HOHOHOHO。那时候这种新语法还没最后确定下来呢。
耍宝王 2010-02-03
  • 打赏
  • 举报
回复
class A
{
static const int n=100;
};
const int A::n;//我记得还要加一句
mstlq 2010-02-03
  • 打赏
  • 举报
回复
回8楼……
你说提到的情况,是VC6一个著名的bug
小小攻城师 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huiguixian 的回复:]
C/C++ code#include<string>usingnamespace std;class A
{staticconstint n=100;
};int main()
{return0;
}
vs05编译通过
[/Quote]
我觉得应该是vc6本身的问题
提议楼主换编译器
小小攻城师 2010-02-03
  • 打赏
  • 举报
回复
#include <string>
using namespace std;
class A
{
static const int n=100;
};

int main()
{
return 0;
}

vs05编译通过
飞翔的土豆 2010-02-03
  • 打赏
  • 举报
回复
报告LS:
我在VC6.0下写了个下面的代码:

class A
{
static const int n=100;
};

编译不过:
error C2258: illegal pure syntax, must be '= 0'
error C2252: 'n' : pure specifier can only be specified for functions
晨星 2010-02-03
  • 打赏
  • 举报
回复
比如:
struct A {
static const int MY_STATIC = 100;
};
晨星 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 r06041210 的回复:]
感谢各位答复!
顺便求教下:
1.非静态成员是不是就不是声明而是定义了(原谅我说得比较绕口。。)?因为如果不是static的话成员数组必须要制定大小;
2.有关2L说得static const int的特例曾经困扰我很久,求教具体的语法!
[/Quote]
1:其实呢,整个class都是一种声明,虽然我们常说“类的定义”啥啥的,但你知道的,类只有在被实例化,也就是定义对象的时候,才会真正占据内存。当然,非静态成员不存在声明跟定义分开的问题,因为它本来也不需要存在,它只是个用于生成对象的框架,不具备其它意义。不像静态成员,已经代表某个地方有它的定义。所以,定义类的非静态成员的时候,是必需指定长度的。
2:static const int成员可以直接在类中声明的时候初始化,于是也就成了个定义,不需要类外再定义。
飞翔的土豆 2010-02-03
  • 打赏
  • 举报
回复
感谢各位答复!
顺便求教下:
1.非静态成员是不是就不是声明而是定义了(原谅我说得比较绕口。。)?因为如果不是static的话成员数组必须要制定大小;
2.有关2L说得static const int的特例曾经困扰我很久,求教具体的语法!
yzx714 2010-02-03
  • 打赏
  • 举报
回复
因为编译器知道在另外一个地方会说明
小小攻城师 2010-02-03
  • 打赏
  • 举报
回复
静态成员变量的定义一共包括两个部分.

像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.

class A
{
public:
int i; //有默认值
};
class B
{
public:
static int n;
static A Aobj;
};

int B::n = 1; //静态成员变量的初始化
A B::Aobj; //静态成员变量的初始化(实例化)

void main()
{
B Bobj;
printf("B::n=%d Bobj.n=%d Bobj.Aobj.i=%d\n", B::n, Bobj.n, Bobj.Aobj.i);
}
小小攻城师 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 r06041210 的回复:]
看深入浅出MFC中讲消息映射那段有这么一段代码
C/C++ codeclass CView:public CWnd
{public:
...static AFX_MSGMAP_ENTRY _messageEntries[];static AFX_MSGMAP messageMap;virtual AFX_MSGMAP* GetMessageMap()const;
};
其中的静态成员数组为何不指定大小就可以通过编译呢?
[/Quote]
楼上正解,静态本来就只是声明而已。
你必须在类的外面给出明确的初始化操作。
推荐你看类的静态成员!
飞天御剑流 2010-02-03
  • 打赏
  • 举报
回复
当然可以,静态成员只是声明,不是定义( static const int 是特例 ),定义是在类体外的,那时候需要初始化。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧