类的const 数组的初始化。 我定义了这样的类,CTest{public: const BYTE m_ucData[20]; CTest();}CTest::CTest(){}这个m_ucData[20]数组,我怎么样初始化在? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 类的成员变量中出现const好像必须带有static记不太清了这样写应该没有问题的class CTest{public: const static char array[10]; CTest();};//定义const char array[10] = "dfsdfsdf";CTest::CTest(){} 单单的定义const,我不知道在那里初始化,好像放在那里都没有道理,呵呵 MSDN:declaring a nonstatic array with the const specifier. This kind of array cannot be explicitly initialized.只能像楼上的那样 知道原因了。但还是心有不甘啊。to hopen(哈雷):类中可以有const变量,也不必是static类型。但是,类中不能有const数组,因为const数组必须初始化,但这种初始化只能出现在实现文件中,定义方式同C中的数组定义。所以不能有const数组。 不行的,这种数组没法初始化。有几种方法可以避开这个问题:1、加上static修饰符,然后单独放在类外面初始化2、去掉const,这样你就可以在构造函数中初始化,如果你要保证“常性”,你可以把这个成员声明为private,然后提供一个const accessor。3、试试把它放在类的外面,如果想要避免名字冲突,可以放在namespace里,这样就可以直接初始化。4、如果你只是想提供一大堆常量,干脆用enum吧。总的来说,尽管这算是一个语言缺陷,但是这样做本身就不是一个好主意,估计短期内不会看到C++语言标准对这种做法的支持。 To windoze(瞌睡窗): 常量用enum?行不通吧?比如浮点,结构!不明白的是,既然在C中支持数组的初始化,为什么在C++中就不行?想初始化,大半是为了编程方便,如果还需加那么多东西,有违初衷啊! um只能用来定义整形常量,浮点形当然就不行了。struct不是大问题,你只需要给它一个缺省的构造函数来设定初值即可。这一点算是一个语法缺陷,目前C++0X的标准好像有这个提案,应该是关于“聚合字面常量”的,不过我对这一点心里比较没底:-)。不过话说回来,既然这是一个const数组,也就是说在该类的所有实例中都无法修改它,那么真的没有必要让它在每个实例中都保存一份,从这个角度来说,加上static也许更“正确”,也更有效率。PS.虽然记不太清,但是我似乎记得即使在C语言里也不允许在结构体定义中给数组成员赋初值 const常量的初始化:class CTest{ public: CTest():b(3)//在这里初始化 {}; const int b ;}; “聚集const成员初始化”不是简单const成员初始化。在C++中,可以在变量“定义”时赋初值,比如:int n=0;对于“聚集”类型如数组和结构,可以使用“聚集常量(Aggregate literal)”,如:int a[3]={1, 2, 3};struct S { int a, b;};struct S s={4, 5};聚集常量可以嵌套,如:struct S ss[]={ {1, 2}, {3, 4} };但是不能在变量“声明”时赋初值,比如:struct ST { int a=0; // 错误,这是一个变量“声明”,不是“定义”};对于static const“整型”成员,这里的“整型”包括各种整数、字符、bool和enum,C++提供了一个语法便利,可以直接将初值写在“声明”处,而不需要单独的定义。但是对于所有其它类型则不允许这样做,上例改为:struct ST { const static int a=0; // 正确 // const static float f=1.2; // 错误,只能用于整型成员 // const static int b[3]={1, 2, 3}; // 错误};真正的麻烦之处在于聚集类型的初始化甚至不能放在构造函数的初始化列表里,如:struct ST { const int b[3]; ST() : b( /* 这个地方没法写,C++目前不能把聚集常量当作简单常量处理 */ ) { b[0]=1; b[1]=2; b[2]=3; // 错误,因为b被声明为const,这个地方还是没法写 }};总之这看起来像是C++语法中的一个小缺陷。虽然这个缺陷可能在后续的C++标准中完善,但是估计短期内没什么希望,一来因为这样做的需求很小,而C++标准委员会眼前有一大堆更重要的问题要处理;二来这样做之后会不会对老程序造成什么兼容向方面的影响尚须广泛测试。 获取其他程序中的CHECKBOX状态 2009年12月,马上进入2010年,大家可以想想过去1年的收获! 请问怎么从PROCESS_INFORMATION结构中得到程序主窗口的HWND句柄? 急问,关于多线程!内有代码 怎样获取CComboBox中下拉列表中选定一项的内容? 高分求救!结贴后加分! 求问高手:关于eMbedded VC中的问题! VC的IDE使用技巧大全 CHtmlView调用自己写的COM老出警告 求MSDN的中文版帮助,给分 怎样用VC编程模拟向Web Sever POST和GET? ListBox控件-高亮显示一个条目<48小时结贴>
这样写应该没有问题的
class CTest
{
public:
const static char array[10];
CTest();
};
//定义
const char array[10] = "dfsdfsdf";CTest::CTest()
{}
declaring a nonstatic array with the const specifier. This kind of array cannot be explicitly initialized.
只能像楼上的那样
但是,类中不能有const数组,因为const数组必须初始化,但这种初始化只能出现在实现文件中,定义方式同C中的数组定义。所以不能有const数组。
1、加上static修饰符,然后单独放在类外面初始化
2、去掉const,这样你就可以在构造函数中初始化,如果你要保证“常性”,你可以把这个成员声明为private,然后提供一个const accessor。
3、试试把它放在类的外面,如果想要避免名字冲突,可以放在namespace里,这样就可以直接初始化。
4、如果你只是想提供一大堆常量,干脆用enum吧。总的来说,尽管这算是一个语言缺陷,但是这样做本身就不是一个好主意,估计短期内不会看到C++语言标准对这种做法的支持。
常量用enum?行不通吧?比如浮点,结构!
不明白的是,既然在C中支持数组的初始化,为什么在C++中就不行?
想初始化,大半是为了编程方便,如果还需加那么多东西,有违初衷啊!
{ public:
CTest():b(3)//在这里初始化
{};
const int b ;
};
int n=0;
对于“聚集”类型如数组和结构,可以使用“聚集常量(Aggregate literal)”,如:
int a[3]={1, 2, 3};
struct S {
int a, b;
};
struct S s={4, 5};
聚集常量可以嵌套,如:
struct S ss[]={ {1, 2}, {3, 4} };但是不能在变量“声明”时赋初值,比如:
struct ST {
int a=0; // 错误,这是一个变量“声明”,不是“定义”
};对于static const“整型”成员,这里的“整型”包括各种整数、字符、bool和enum,C++提供了一个语法便利,可以直接将初值写在“声明”处,而不需要单独的定义。但是对于所有其它类型则不允许这样做,上例改为:
struct ST {
const static int a=0; // 正确
// const static float f=1.2; // 错误,只能用于整型成员
// const static int b[3]={1, 2, 3}; // 错误
};
真正的麻烦之处在于聚集类型的初始化甚至不能放在构造函数的初始化列表里,如:
struct ST {
const int b[3];
ST() : b( /* 这个地方没法写,C++目前不能把聚集常量当作简单常量处理 */ )
{
b[0]=1; b[1]=2; b[2]=3; // 错误,因为b被声明为const,这个地方还是没法写
}
};总之这看起来像是C++语法中的一个小缺陷。虽然这个缺陷可能在后续的C++标准中完善,但是估计短期内没什么希望,一来因为这样做的需求很小,而C++标准委员会眼前有一大堆更重要的问题要处理;二来这样做之后会不会对老程序造成什么兼容向方面的影响尚须广泛测试。