C++中为什么不能在类定义中初始化非静态成员变量

launch401 2007-09-11 11:17:47
而必须在构造函数中初始化呢?
...全文
1211 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
stushl 2011-05-07
  • 打赏
  • 举报
回复 1
静态也不能在类中初始化啊
taodm 2007-09-11
  • 打赏
  • 举报
回复
规定,这就够了。
lockhall 2007-09-11
  • 打赏
  • 举报
回复
偶就知道是规定。
arong1234 2007-09-11
  • 打赏
  • 举报
回复
没那么多为什么,就是规定
launch401 2007-09-11
  • 打赏
  • 举报
回复
我理解还是设计理念的不同,其实java/C#中可以在类定义中“初始化”变量也是出于安全考虑,他们的初始化实际上是给出默认值,实际赋值过程还是在调用构造函数的时候(之前)
fish6344 2007-09-11
  • 打赏
  • 举报
回复
C++中为什么不能在类定义中初始化非静态成员变量?

首先,类究竟什么?类是一个对事物具体抽象的模型,注意,它仅是一个抽象的、慨念上的东东。从程序设计层面看,它仅是一个声明,并不代表一个具体的实例,例如:

class Fish
{
long _x;
void show(void);
}

//即使它有成员函数的定义:
void Fish::show(void)
{
}

即使它有成员函数的定义,但在内存实例这个层面,它什么也没有!什么都没有,你到那儿去初始化它的成员x呢?

而且,从类的语意来看,它表示有无限个具有相似性(不是相同性)的对象实例的抽象慨括,非静态成员变量对类来说,是一个变化的值(有无穷的解),它是类的可变部份,语言以及类的设计者不能以相同的值去初始化其可变部份(x)!

但对类的不变部份,语言还是适当的允许你在类中去初始化,例如整型int及类整型(long、
char等)等静态常量你还是可以在类中初始化它们的!




arong1234 2007-09-11
  • 打赏
  • 举报
回复
规定,而且也不应该在构造函数中初始化,如果你这样做了,说明你代码写错了
合理的做法

class A
{
static int i;
};

int A::i =0; //这才是合理的初始化方式
storin 2007-09-11
  • 打赏
  • 举报
回复
支持ar_2002的说法,类的声明没有实际分配内存,怎么初始化?
ar_2002 2007-09-11
  • 打赏
  • 举报
回复
定义类的时候并没有分配内存,这时候赋值的话值放在哪里呢?
当用类构造对象的时候首先分配内存然后调用构造函数,这时候才可以初始化非静态成员变量.
静态成员变量定义的时候在静态存储区中就分配了内存所以可以初始化.
benjamin_pan 2007-09-11
  • 打赏
  • 举报
回复
C++中为什么不能在类定义中初始化非静态成员变量
你都说是在类的定义中了,只是定义了类,没有实例化,static可以初始化是因为它是保存在内存中类外的全局变量区域的
zyx040404 2007-09-11
  • 打赏
  • 举报
回复
编译器的限制
如果是static的就可以,因为编译器可以
shrinerain 2007-09-11
  • 打赏
  • 举报
回复
其实C#的初始化是编译器自动生成了一个特殊的函数.ctor,这个函数里面进行初始化工作...

C++编译器没有这个功能.
shrinerain 2007-09-11
  • 打赏
  • 举报
回复
规定而已...

C#可以...C++就不可以....

至于哪个好...仁者见仁...

jxlczjp77 2007-09-11
  • 打赏
  • 举报
回复
如果成员都在定义时给了默认初始值,那还要构造函数干嘛?
构造函数本来就是为了所有成员初始化而存在的,这样集中初始化可以方便管理。

假如有一个非常大的类,上百个成员函数,又有N个成员变量夹杂在这么多成员函数中,假如成员变量可以定义时给定初值的话,那么你决得是分散在各个成员变量定义时初始化好呢?还是集中在一个构造函数中初始化好呢?

64,267

社区成员

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

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