c++有些让人误解的东西。

chin_chen 2009-03-05 10:00:36
首先说明一个常识性的东西
class myclass{..};
myclass ary1[n]={myclass(..),myclass(..),..};
myclass ary2[n];
这个两种分配数组的方法中,ary1是不是叫初始话过的数组名了,而ary2是不是叫没初始化过的数组名。


那么再接着看
class myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass ary[2];
};

myOtherClass():ary(..)这个好象是对ary进行初始化,但是这个ary是不能初始化的。因为它是系统栈自动分配的。(大家可以想到让这个ary初始化的方法么?我是想不到!)

高手说下类里面初始化到底是什么概念啊?
我上面说的这个ary不能初始化的理由对不?
myclass ary[2];这个是在构造函数之前就已经分配好了的吧??



...全文
141 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-03-05
  • 打赏
  • 举报
回复
看来这还远不如你所说的是“常识性”的东西哦
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 arong1234 的回复:]
int a[1]={0}只允许这种情形下用,不能进行任何“就好像”的扩展,这是特殊情形,没有办法

int a[2];
a=new int[2]; //这种初始化明显是错误的,你楼上其实就是这样初始化
引用 13 楼 chin_chen 的回复:
我觉得 好像是 就像  int a[1]={0},只是给a的指向的内存赋值。 int *b=&a;是给b赋值一样。是不是这个道理。那个a的值是不可能改变的哦。

[/Quote]

我知道的
所以我说Quote=引用 13 楼 chin_chen 的回复:]
我觉得 好像是 就像 int a[1]={0},只是给a的指向的内存赋值。 int *b=&a;是给b赋值一样。是不是这个道理。那个a的值是不可能改变的哦。
[/Quote]
arong1234 2009-03-05
  • 打赏
  • 举报
回复
int a[1]={0}只允许这种情形下用,不能进行任何“就好像”的扩展,这是特殊情形,没有办法

int a[2];
a=new int[2]; //这种初始化明显是错误的,你楼上其实就是这样初始化
[Quote=引用 13 楼 chin_chen 的回复:]
我觉得 好像是 就像 int a[1]={0},只是给a的指向的内存赋值。 int *b=&a;是给b赋值一样。是不是这个道理。那个a的值是不可能改变的哦。
[/Quote]
arong1234 2009-03-05
  • 打赏
  • 举报
回复
1. 首先从来不支持用数组赋值数组
2. 其次new myclass[2]返回的是myclass*类型,和ary类型也不匹配
3. 数组的初始化方法非常特别,只允许在定义它的同时使用初始化数组来初始化。在类中就非常tricky,其实没有任何办法去用另外一个数组来初始化它

4. 你前文说不能初始化ary是错误的,至少myclass还有缺省构造函数。如果你要把一个类的对象数组作为另外一个类的成员,缺省构造函数是必须的,它可以初始化ary

顺便说依据:所谓缺省构造函数就是不带参数的构造函数
[Quote=引用 12 楼 chin_chen 的回复:]
C/C++ codeclass myclass{..};
myOtherClass():ary(new myclass[2]){}
private:
myclass ary[2];
};


这样不行。
谁知道解释一下吧。
[/Quote]
fairchild811 2009-03-05
  • 打赏
  • 举报
回复
构造函数内初始化
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
我觉得 好像是 就像 int a[1]={0},只是给a的指向的内存赋值。 int *b=&a;是给b赋值一样。是不是这个道理。那个a的值是不可能改变的哦。
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
class myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(new myclass[2]){}
private:
myclass *ary;
};

这样可以。
class myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(new myclass[2]){}
private:
myclass ary[2];
};

这样不行。
谁知道解释一下吧。
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hairetz 的回复:]


没看懂你最后一句话,但是很明显myclass ary[2];这个对象肯定是先于构造函数存在,这有问题莫?

[/Quote]
class myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass *ary;
};

请问这个也很明显么?也是先于构造函数之前存在的?
pointerfree 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
1. 你说的ary2,ary1都是初始化过的(如果你的类设计的没错误的话),因为类是有构造函数的,构造函数有义务正确初始化自己。myclass ary2[n]定义的数组,会被它元素的所属的类的缺省构造函数自动初始化。

2. 同上,ary2需要用缺省构造函数初始化。好像无法在初始化列表初始化
3. 对象的成员变量不会由编译器预先分配好,也不会在构造函数前被初始化好,而是在构造函数的初始化列表中被初始化好的

引用楼主 chin_chen 的…
[/Quote]
adventurelw 2009-03-05
  • 打赏
  • 举报
回复
ary是头元素的指针吧
myotherclass::myotherclass() : ary(...){}
ary不是对象名称,应该是错的吧
是不是应该
myotherclass::myotherclass() : ary[0](...), ary[1](.....){}?

或者直接让其自动调用默认构造函数,如果有需要的话,再在{}中重新赋值
但myclass对象ary[0]和ary[1]肯定是要在进入myotherclass构造函数之前初始化的。
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 arong1234 的回复:]
不对,成员变量的第一次初始化就是在初始化列表,不比这个早,也不比这个晚,这是为什么这被叫做“初始化列表”的原因,这里就是指导成员变量和基类的初始化方式的

引用 3 楼 chin_chen 的回复:
那说简单点:
C/C++ codeclass myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass ary[2];
};


这个ary的值在初始化列表之前的时候就有了。。初始化只是初始里面的值而已。
是不…
[/Quote]

那为啥,ary不能初始化。。?
qingkongyihe2008 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
1. 你说的ary2,ary1都是初始化过的(如果你的类设计的没错误的话),因为类是有构造函数的,构造函数有义务正确初始化自己。myclass ary2[n]定义的数组,会被它元素的所属的类的缺省构造函数自动初始化。

2. 同上,ary2需要用缺省构造函数初始化。好像无法在初始化列表初始化
3. 对象的成员变量不会由编译器预先分配好,也不会在构造函数前被初始化好,而是在构造函数的初始化列表中被初始化好的

引用楼主 chin_chen 的…
[/Quote]
正解
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chin_chen 的回复:]
那说简单点:
C/C++ codeclass myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass ary[2];
};


这个ary的值在初始化列表之前的时候就有了。。初始化只是初始里面的值而已。
是不是这样了?
[/Quote]
没看懂你最后一句话,但是很明显myclass ary[2];这个对象肯定是先于构造函数存在,这有问题莫?
初始化就是对一段内存做第一次赋值,就是初始化啊.
leo315 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chin_chen 的回复:]
那说简单点:C/C++ codeclassmyclass{..};classmyOtherClass
{public:
myOtherClass():ary(..){}private:
myclass ary[2];
};
这个ary的值在初始化列表之前的时候就有了。。初始化只是初始里面的值而已。
是不是这样了?
[/Quote]

是这样的,你debug的时候就能看见它初始化的变化过程了。
arong1234 2009-03-05
  • 打赏
  • 举报
回复
不对,成员变量的第一次初始化就是在初始化列表,不比这个早,也不比这个晚,这是为什么这被叫做“初始化列表”的原因,这里就是指导成员变量和基类的初始化方式的

[Quote=引用 3 楼 chin_chen 的回复:]
那说简单点:
C/C++ codeclass myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass ary[2];
};


这个ary的值在初始化列表之前的时候就有了。。初始化只是初始里面的值而已。
是不是这样了?
[/Quote]
chin_chen 2009-03-05
  • 打赏
  • 举报
回复
那说简单点:
class myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass ary[2];
};

这个ary的值在初始化列表之前的时候就有了。。初始化只是初始里面的值而已。
是不是这样了?
oyljerry 2009-03-05
  • 打赏
  • 举报
回复
类里初始化指,调用了构造函数生成了对象的同时,给成员变量等制定一个初始值等来进行初始化
arong1234 2009-03-05
  • 打赏
  • 举报
回复
1. 你说的ary2,ary1都是初始化过的(如果你的类设计的没错误的话),因为类是有构造函数的,构造函数有义务正确初始化自己。myclass ary2[n]定义的数组,会被它元素的所属的类的缺省构造函数自动初始化。

2. 同上,ary2需要用缺省构造函数初始化。好像无法在初始化列表初始化
3. 对象的成员变量不会由编译器预先分配好,也不会在构造函数前被初始化好,而是在构造函数的初始化列表中被初始化好的

[Quote=引用楼主 chin_chen 的帖子:]
首先说明一个常识性的东西
C/C++ codeclass myclass{..};
myclass ary1[n]={myclass(..),myclass(..),..};
myclass ary2[n];

这个两种分配数组的方法中,ary1是不是叫初始话过的数组名了,而ary2是不是叫没初始化过的数组名。


那么再接着看
C/C++ codeclass myclass{..};
class myOtherClass
{
public:
myOtherClass():ary(..){}
private:
myclass ary[2];
};


myOtherClass():ary(..)这个好象…
[/Quote]

65,209

社区成员

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

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