很弱的,从没想过的问题,如何初始化一个类的成员,这个成员的类型是数组
比如
class CTest
{
public:
CTest(void);
~CTest(void);
protected:
int const m_iArr[2][2];
};
问题是,怎么给这个数组 m_iArr 赋初值啊?
问题点数:50、回复次数:23Top
1 楼useresu(俗人)(灌水是我无言的抗议)回复于 2005-06-01 15:45:51 得分 0
n多方法,
可以写个init(),在其中循环cin值,
也可以用其他的数组赋值啊.
memcpy()就可以了Top
2 楼stkane(左手无名指)回复于 2005-06-01 15:52:24 得分 0
这是个const的啊Top
3 楼xzgyb(老达摩)回复于 2005-06-01 16:04:17 得分 0
好像无法在初始化列表中对const数组初始化
可以用
static int const m_iArr[2][2];
Top
4 楼umbrella1984(雨伞(KEN))回复于 2005-06-01 16:07:58 得分 0
构造函数里初始化可以吗?另外int const m_iArr[2][2];和const int m_iArr[2][2];有什么不同?Top
5 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2005-06-01 16:16:56 得分 0
CTest::CTest ()
:m_iArr ({})
{
}
不知道这样是否可以?Top
6 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-06-01 16:23:30 得分 0
可以写个init(),在其中循环cin值,
------------------
嗯,可以在构造函数里调用这个init().Top
7 楼stkane(左手无名指)回复于 2005-06-01 16:27:17 得分 0
晕倒,重申:
int cosnt m_iArr[2][2];
或者用
const int m_iArr[2][2];
这两个是一样的。
就是说这个类的成员不仅仅是数组,还是常量数组。
另外一个问题是
如果 声明了 int* m_piArr;
构造函数中: m_piArr=new int[2];
这个数组是不是也不能初始化?
Top
8 楼whyglinux(山青水秀)回复于 2005-06-01 16:43:07 得分 50
对于类的 const 非静态数据成员,其初始化的唯一场所是在构造函数的初始化列表中进行(因为是const,不能在构造函数中通过赋值语句进行)。如:
class A {
public:
A() : m(5) {}
private:
const int m;
// ...
};
但是这样的话对这个 const 非静态数据成员就有一个要求:这个成员类型必须要有对应的构造函数,只有通过调用构造函数才能对其完成初始化。然而,数组却不具备这个条件。因此,我们说上面的程序是病态的(ill-formed),即其实现是不正确的。Top
9 楼kenyle(哎呀妈呀~这不就是传说中的B13吗~~)回复于 2005-06-01 17:05:29 得分 0
这个问题还弱呀!试了半天没有一个在VC下行的,也许其它的编译器行吧。这个主要看ANSC C++的标准了。实在不行到官方去看看。Top
10 楼foochow(无聊,灌水......)回复于 2005-06-01 17:48:29 得分 0
用老达摩的方法static int const m_iArr[2][2];
Top
11 楼qhfu(改个名字)回复于 2005-06-01 18:46:57 得分 0
觉得whyglinux(山青水秀) 说的有道理,初始化代码是编译器自动加到构造函数里的,, 所以不能年在做第二次付值了。Top
12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-06-01 19:13:43 得分 0
要么定义成静态的,然后全局初始化Top
13 楼zdy_8212(zdy_8212)回复于 2005-06-02 03:35:46 得分 0
多次分配Top
14 楼Coffee_62(62度的咖啡)回复于 2005-06-02 05:28:36 得分 0
我也想知道Top
15 楼stkane(左手无名指)回复于 2005-06-02 15:30:22 得分 0
to 山清水秀:
如果是pArr=new int[100];
有办法对这个pArr赋初值吗?Top
16 楼whyglinux(山青水秀)回复于 2005-06-02 15:43:01 得分 0
>> 如果是pArr=new int[100];
>> 有办法对这个pArr赋初值吗?
pArr是什么?pArr=new int[100];不就是给pArr赋值吗?
再说清楚一点,否则不明白你的意思。
Top
17 楼july81(鸟)回复于 2005-06-02 16:44:24 得分 0
他的意思我想是给指针指向的那块内存区域赋值。这样是不行的。Top
18 楼hj008(catch jjhou)回复于 2005-06-02 16:50:58 得分 0
对于类的 const 非静态数据成员,其初始化的唯一场所是在构造函数的初始化列表中进行(因为是const,不能在构造函数中通过赋值语句进行),这是最重要的.你可以查看一下C++大学教程里关于类的那一章。也可以看看楼上whyglinux(山青水秀)的方法,很对。
Top
19 楼sinkinglife(沉沦)回复于 2005-06-02 17:20:18 得分 0
这好像是没有办法。声明一个const int arr[10][10]编译器都报错,无法初始化。Top
20 楼CloudOfFly(追忆)回复于 2005-06-02 17:36:51 得分 0
用构造函数列表初始化Top
21 楼stkane(左手无名指)回复于 2005-06-02 18:11:17 得分 0
我的意思就是
july81(鸟)
所说的,我想这是C里面不多的几个不十分逻辑的地方之一吧。
要知道这一点在不允许任何static变量和global变量的系统里面,实在是。。。
Top
22 楼mostideal(三甲)回复于 2005-06-03 00:16:48 得分 0
markTop
23 楼wharl()回复于 2005-06-04 15:49:12 得分 0
#include <iostream>
using namespace std;
class CTest
{
public:
CTest()
{
cout << m_iArr[1][1] << endl;
}
~CTest(void){};
protected:
static int m_iArr[2][2];
};
int CTest::m_iArr[2][2]={1, 2, 3, 4};
int main()
{
CTest a;
return 0;
}
似乎只有这样才能通过。。。。
protected:
static int m_iArr[2][2];
该为
protected:
static int const m_iArr[2][2];
就报错:error C2373: 'protected: static int const (* CTest::m_iArr)[2]' : redefinition; different type modifiers
我是菜鸟。。。。。。。
望高人指点怎样初始化
static int const m_iArr[2][2];Top




