C++类定义中数组初始化问题(急)

treasurelife 2005-03-24 12:01:53
操作系统:win2000和winxp。
编译环境:VC6.0
******************
#include <iostream.h>

class TestArray
{
private:
int Arr[3] = {1,2,3}; //?????

public:
void OutData()
{
for(int i = 0; i < 3; i ++)
cout << Arr[i] << endl;
}
};

void main()
{
TestArray myArray;
myArray.OutData();
}

******************

--------------------Configuration: array - Win32 Debug--------------------
Compiling...
array.cpp
E:\文档\MyProjects\CPP\array.cpp(6) : error C2059: syntax error : '{'
E:\文档\MyProjects\CPP\array.cpp(6) : error C2334: unexpected token(s) preceding '{'; skipping apparent function body
Error executing cl.exe.

array.exe - 2 error(s), 0 warning(s)
******************
为什么Arr[3] = {1,2,3}会有语法错误?在类的成员变量定义的同时用{}给数组初始化不行吗?
...全文
6779 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoran2267 2005-03-24
  • 打赏
  • 举报
回复
我也有过这样的错误
vikinzqs 2005-03-24
  • 打赏
  • 举报
回复
除了静态数据成员外,数据成员不能在类体内显式的初始化
tudou614 2005-03-24
  • 打赏
  • 举报
回复
好了,我醒过神了,问了一个愚蠢的问题
F~ZEBRA 2005-03-24
  • 打赏
  • 举报
回复
都是谢手呀,好多东西我都看不懂,以前不来CSDN,乱学了很多,浪费了很多生命,现在我不心浮气燥了,我只学C++,各位高手以后多多指教小弟,其实我也不小了,81年的,今年是我的本命年,听说本命年都不好过
tudou614 2005-03-24
  • 打赏
  • 举报
回复
00401615 B8 CC CC CC CC mov eax,0CCCCCCCCh ;和main()函数中相同什么意思?
0040161A F3 AB rep stos dword ptr [edi] ;这个什么含义??


main()函数反汇编如下:

main() {
00401544 55 push ebp
00401545 8B EC mov ebp,esp
00401547 83 EC 24 sub esp,24h
0040154A 50 push eax
0040154B 57 push edi
0040154C 51 push ecx
0040154D 8B FD mov edi,ebp
0040154F 83 EF 24 sub edi,24h
00401552 B9 09 00 00 00 mov ecx,9
00401557 B8 CC CC CC CC mov eax,0CCCCCCCCh ;这里相同,和上面比较代表什么含义
0040155C F3 AB rep stos dword ptr [edi]
0040155E 59 pop ecx
0040155F 5F pop edi
00401560 58 pop eax

tudou614 2005-03-24
  • 打赏
  • 举报
回复
TO:回复人: quickreport(快速报告)

下面是构造函数的反汇编代码---请指出:到底是对象先创建,还是先构造函数然后创建对象

Z::Z(int ii, int jj) {
00401604 55 push ebp
00401605 8B EC mov ebp,esp
00401607 56 push esi
00401608 50 push eax
00401609 57 push edi
0040160A 51 push ecx
0040160B 8B FD mov edi,ebp
0040160D 83 EF 04 sub edi,4
00401610 B9 01 00 00 00 mov ecx,1
00401615 B8 CC CC CC CC mov eax,0CCCCCCCCh
0040161A F3 AB rep stos dword ptr [edi]
0040161C 59 pop ecx
0040161D 5F pop edi
0040161E 58 pop eax
0040161F 8B C1 mov eax,ecx
00401621 89 45 FC mov dword ptr [ebp-4],eax

或者楼下高手帮着注释一下汇编代码的含义!!

谢谢
mafei008 2005-03-24
  • 打赏
  • 举报
回复
强!!!
quickreport 2005-03-24
  • 打赏
  • 举报
回复
上述是正解。另外再说明一下:
6.6 集合初始化
顾名思义,集合(aggregate)就是多个事物聚集在一起,这个定义包括混合类型的集合:像struct和class等,数组就是单一类型的集合。
初始化集合往往既冗长又容易出错,而C++中集合初始化(aggregate initialization)却变得很方便而且很安全。当产生一个集合对象时,要做的只是指定初始值就行了,然后初始化工作就由编译器去承担了。这种指定可以用几种不同的风格,它取决于正在处理的集合类型。但不管是哪种情况,指定的初值都要用大括号括起来。比如一个内部类型的数组可以这样定义:
int a[5] = { 1, 2, 3, 4, 5 };
如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初始化少于数据元素的个数,那将会怎么样呢?例如:
int b[6] = {0};
这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果定义了一个数组而没有给出一列初始值时,编译器并不会去做初始化工作。所以上面的表达式是将一个数组初始化为零的简洁方法,它不需要用一个for循环,也避免了“偏移1位”错误(它可能比for循环更有效,这取决于编译器)。
数组还有一种叫自动计数(automatic counting)的快速初始化方法,就是让编译器按初始化值的个数去决定数组的大小:
int c[ ] = { 1, 2, 3, 4 };
现在,如果决定增加另一个元素到这个数组上,只要增加一个初始化值即可,如果以此建立我们的代码,只需在一处作出修改即可。这样,在修改时出错的机会就减少了。但怎样确定这个数组的大小呢?用表达式sizeof c / sizeof *c(整个数组的大小除以第一个元素的大小)即可算出,这样,当数组大小改变时它不需要修改。
for ( int i = 0; i < sizeof c /sizeof *c; i++)
c[i]++;
因为结构也是一种集合类型,所以它们也可以用同样的方式初始化。因为C风格的struct的所有成员都是public型的,所以它们的值可以直接指定。
struct X {
int i;
float f;
char c;
};
X x1 = { 1, 2.2, ‘c’ };
如果有一个这种struct的数组,也可以用嵌套的大括号来初始化每一个对象:
X x2[3] = { {1, 1.1, ‘a’}, {2, 2.2, ‘b’}};
这里,第三个对象被初始化为零。
如果struct中有私有成员(典型的情况就是C++中设计良好的类),或即使所有成员都是公共成员,但有构造函数,情况就不一样了。在上例中,初始值被直接赋给了集合中的每个元素,但构造函数是通过正式的接口来强制初始化的。这里,构造函数必须被调用来完成初始化,因此,如果有一个下面的struct类型:
struct Y {
float f;
int i;
Y(int a);
};
必须指示构造函数调用,最好的方法像下面这样:
Y y1[ ] = { Y(1), Y(2), Y(3) };
这样就得到了三个对象和进行了三次构造函数调用。只要有构造函数,无论是所有成员都是公共的struct还是一个带私有成员的class,所有的初始化工作都必须通过构造函数来完成,即使正在对一个集合初始化。
下面是多构造函数参数的又一个例子:
//: C06:Multiarg.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Multiple constructor arguments
// with aggregate initialization
#include <iostream>
using namespace std;

class Z {
int i, j;
public:
Z(int ii, int jj);
void print();
};

Z::Z(int ii, int jj) {
i = ii;
j = jj;
}

void Z::print() {
cout << "i = " << i << ", j = " << j << endl;
}

int main() {
Z zz[] = { Z(1,2), Z(3,4), Z(5,6), Z(7,8) };
for(int i = 0; i < sizeof zz / sizeof *zz; i++)
zz[i].print();
} ///:~
注意:这看起来就好象对数组中的每个对象都调用显式的构造函数。
stupidfish2004 2005-03-24
  • 打赏
  • 举报
回复
并不是Arr[3] = {1,2,3}有语法错误,而是因为:
在class 中,变量不能直接初始话,需要通过构造函数(或拷贝构造函数)来初始话,如果程序员没有定义构造函数系统会有一个默认构造函数。构着函数名与类名相同,如:你的类为TestArray,
则构造函数为TestArray(),变量Arr的初始化在TestArray()中完成。


#include <iostream.h>

class TestArray
{
private:
int *Arr;

public:
TestArray();//constractor
void OutData()
{
for(int i = 0; i < 3; i ++)
cout << Arr[i] << endl;
}
};

//the constructor
TestArray::TestArray()
{
Arr=new int[3];
for(int i=0;i<3;i++)
Arr[i]=i;
}

void main()
{
TestArray myArray;
myArray.OutData();
}

宋宝华 2005-03-24
  • 打赏
  • 举报
回复
举个最简单例子
struct a

int a=1;
int b=2;
};
这也不能通过啊!
原因很简单,因为struct a此时只是在说明有这么个类型,而并没有定义一个具体的变量和分配内存空间
只有这样:
struct a b={1,2};

64,671

社区成员

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

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