请问为什么static成员一定要在类外初始化?

inssuc 2007-08-07 03:32:10
#include <iostream.h>

class CDummy
{
public:
static int n;
};

int CDummy::n=9;

void main()
{
cout<<CDummy::n<<endl;
}

上面这样完全没问题,但是不能直接在类中初始化,比如:

static int n=9;

书上的解释是"为了避免被多次重复声明",这个地方不理解,如果写在类里话,什么情况下会被多次重复声明?
...全文
1066 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞羽飞之猪 2007-09-26
  • 打赏
  • 举报
回复
fish6344() ( ) 信誉:100 正解!

喜欢fish的答案!
neverland_83 2007-08-09
  • 打赏
  • 举报
回复
类定义仅仅只是定义而已,没有分配内存空间的,所以不能初始化。
除了使用static const int SIZE = 10; 或 enum{SIZE = 10};
herman~~ 2007-08-09
  • 打赏
  • 举报
回复
static成员一定要在类外实现
loops 2007-08-09
  • 打赏
  • 举报
回复
静态成员变量为所有类的实例所共有,换句话说它不是每个实例的私有财产,所以当然要在类外面定义并初始化了。此外,c++里面一个变量只能被定义和初始化一次,放在.h里面,岂不是每个类实例化的时候,都要定义和初始化那个静态成员一次了。
mldmillis 2007-08-09
  • 打赏
  • 举报
回复
ma100() ( ) 信誉:100

正解
daohua 2007-08-09
  • 打赏
  • 举报
回复
如果定义在类里面,在创建多个对象的时候会多次定义静态变量,造成重复定义,而静态变量在内存中只能有一份,所有对象共用的
fish6344 2007-08-09
  • 打赏
  • 举报
回复
为什么static成员一定要在类外初始化?

这是因为被static声明的类静态数据成员,其实体远在main()函数开始之前就已经在全局数据段中诞生了(见《Inside The C++ Object Model》page247)!其生命期和类对象是异步的,(而且静态语意说明即使没有类实体的存在,其静态数据成员的实体也是存的)这个时候对象的生命期还没有开始,如果你要到类中去初始化类静态数据成员,让静态数据成员的初始化依赖于类的实体,,那怎么满足前述静态语意呢?难道类永远不被实例化,我们就永远不能访问到被初始化的静态数据成员吗?

所以我的朋友,为了满足C++的static语意,static成员一定要在类外初始化!
jucee 2007-08-08
  • 打赏
  • 举报
回复
记住static变量永远不要在.h文件中定义,但声明是可以的,声明和定义是2回事。
星羽 2007-08-08
  • 打赏
  • 举报
回复
ma100() ( ) 信誉:100


已经把问题讲得很清楚,搂主你有没有看?

Oversense 2007-08-08
  • 打赏
  • 举报
回复
ps: 你看得那本 书上的解释 是错的

这个是由c++的编译模型决定的,事实上,一个变量肯定可以多次重复声明,只要不多次重复定义就可以了
Oversense 2007-08-08
  • 打赏
  • 举报
回复

一般的c++ 都是把一个cpp文件编译成一个obj文件

CDummy 里面的 static int n 全局唯一,需要找一个obj文件放

你放在头文件里面,可以被include很多次,那到底放在那个obj里面呢?编译器不知道了吧

那就要自己写在一个cpp文件里面,这样才好办,编译器才知道放在obj里面,link的时候也好办

明白了吧。
fmjk525283 2007-08-08
  • 打赏
  • 举报
回复
另外如果可以在构造函数中定义,那static岂不没作用了

假如构造函数给n附初值4

CDummy xXx;
xXx.n = 3;//4->3

CDummy yYy;//3->4

所以要了解一个关键字为什么不能这样用,要重点考虑定义这样一个关键字的作用是干吗
fmjk525283 2007-08-08
  • 打赏
  • 举报
回复
静态成员之所以这样规定就是因为他是静态的,这是又静态的性质决定的, 费话了

静态变量是类的东西有点像this指针,他是类的全局变量,在一个生命周期中类所有对象对静态程员的变量附值/更改都是在对类的这个变量附值/更改,对象可以对其操作但其又不是具体某一个对象的变量,如下:

{

CDummy xXx;
xXx.n = 3;

CDummy yYy;
yYy.n = 8;

输出xXx.n应该输出多少呢,你试试,

静态成员函数也可这样理解,它属于类而不属于某个类对象这点就……

}

fish_autumn 2007-08-08
  • 打赏
  • 举报
回复
理解成全局变量就行了
whogdog 2007-08-07
  • 打赏
  • 举报
回复
static const 用法不同吧? static const 的值是编译器符号表中
记录的,如果没有涉及地址的操作,它根本就不会分配内存空间。
jxlczjp77 2007-08-07
  • 打赏
  • 举报
回复
C++primer里面有将一种可以在类定义是初始化的情况:

Ordinarily, class static members, like ordinary data members, cannot be initialized in the class body. Instead, static data members are normally initialized when they are defined.

One exception to this rule is that a const static data member of integral type can be initialized within the class body as long as the initializer is a constant expression:
class Account {
public:
static double rate() { return interestRate; }
static void rate(double); // sets a new rate
private:
static const int period = 30; // interest posted every 30 days
double daily_tbl[period]; // ok: period is constant expression
};

A const static data member of integral type initialized with a constant value is a constant expression. As such, it can be used where a constant expression is
required, such as to specify the dimension for the array member daily_tbl.

When a const static data member is initialized in the class body, the data member must still be defined outside the class definition.
When an initializer is provided inside the class, the definition of the member must not specify an initial value:
// definition of static member with no initializer;
// the initial value is specified inside the class definition
const int Account::period;

whogdog 2007-08-07
  • 打赏
  • 举报
回复
如果允许在类内定义的话,编译器构造符号表时就得额外它的值也放到符号表中,
但是static的用途又是为了给所有的对象共享一块存储空间,这样作划不来呀
tsubor 2007-08-07
  • 打赏
  • 举报
回复
静态成员是类的所以类对象共有的,所以能在类的成员函数中初始化
seysey 2007-08-07
  • 打赏
  • 举报
回复
应该是为了避免每构造一个类的对象就重复声明并定义,这个东西只有1份,不像其他数据成员每个对象都有一个。这个重复定义会有错误
inssuc 2007-08-07
  • 打赏
  • 举报
回复
噢,那我照规定做..
加载更多回复(5)

64,637

社区成员

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

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