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];这个是在构造函数之前就已经分配好了的吧??



...全文
125 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]
很多同学对咱们C语言的课程、学习存在着很多误解,而且很多同学还不知道《C语言高级教程》后面的课程安排是什么,因此这里一并做一个说明。有同学问“别人都说开发数据库系统、Web系统还是Java、C#等最流行,咱们用C语言学了开发也不是浪费吗?”、“C语言不是做嵌入式开发、操作系统等底层的东西吗?”、“我们为什么不讲C语言的嵌入式开发?”、“人家都学Web开发,咱们这学C语言开发C/S的程序不是落伍了吗?”。 确实在实际工作中,由于C语言的门槛比较高,很少有实际项目用C语言进行数据库系统、Web系统等的开发的。但是我不止一次强调“学习时学东西和工作时学东西是不一样的”。 工作以后选用的技术、语言一定是选择做合适、最方便做所从事方面的,比如开发Web程序肯定首选PHP、Java、.net,开发底层系统肯定首选C/C++,开发桌面系统肯定首选VB、Delphi,也就是“用合适的语言做合适的事情”; 但是对于在校生来说则是“用最熟悉的语言做所有事情”。初学编程的人最容易在语言的表层陷入 太长时间,如果要学数据库开发了就要去学Delphi、PB,又要学Web开发了就又去学Java、.net,又要学底层开发了就又去学C/C++, 可是每门语言都没深入,最后真正要学的数据库开发、Web开发、底层 开发等等没怎么学会,倒是把大量的时间浪费在学这些基础语法上,浪费了宝贵的时间, 这也是我痛 恨目前很多大学课程安排的一个原因。因此我的倡导就是对于在校生来说则是“用最熟悉的语言做所 有事情”,我甚至建议大学只学一门C语言就够了,然后就教大家用C语言做所有的方面。

64,682

社区成员

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

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