关于「只有静态常量整型数据成员才可以在类中初始化」的若干

时间:2022-08-17 20:01:49
今天刚看了一下C++语法,并安装了VS2012,在类中初始化定义的数据时提示这个错误。
所以想问问:
为什么「只有静态常量整型数据成员才可以在类中初始化」?(好像在其他编译环境下都没有这样的情况啊)
那么我一个很大的数组想全部初始化为零应该如何做? (也就是说不能使用int a[0] = {0};了)

12 个解决方案

#1


C++ 11 是支持 类内初始化的,意味着你安装的如果是vs2013就没这个问题了

按你的情况,可以在构造函数的初始化列表中初始化.

#2


能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)

#3


印象中,静态常量整型数据成员只分配一次空间

#4


在构造函数的初始化列表中 似乎也不能初始化数组,除非用统一初始化{}  但这个也不支持

所以,在构造函数中 memset  之类的 手动修改内存值吧

#5


使用memset根你的{0}实际是一个效果.
你自己可以使用反汇编看看, 其实={0}在数组元素比较多的时候就会被编译成memset.

#6


int Val[0x100] = {0};
010B55A2  mov         dword ptr [Val],0 
010B55AC  push        3FCh 
010B55B1  push        0    
010B55B3  lea         eax,[ebp-404h] 
010B55B9  push        eax  
010B55BA  call        memset (115BDD0h)   //memset调用
010B55BF  add         esp,0Ch 

#7


int a[50] = {};

#8


C++11 之前的标准
只有静态常量整型数据成员,才可以在类中初始化。

这是因为,当时认为,类定义中的数据定义,是一种声明,不是数据定义。
当用类 定义对象(变量,常量)时候,才开始定义数据。

静态常量整型数据成员
1)不是对象的一部分
2)可以产生常量表达式,所以可以在类中初始化。---否则,用它作为数组的大小,就不合适了。
静态常量整型数据成员,能够用来当作常量表达式使用,
不在内部定义的话,则该常量表达式未定义,就不能使用了。

C++11 非静态成员变量(常量),可以直接初始化,或者在初始化表中初始化。
C++11 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。

#9


引用 2 楼 OmnipotentYouth 的回复:
能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)

在构造函数中初始化

#10


引用 2 楼 OmnipotentYouth 的回复:
能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)

class A
{
public:
    A(){a[50]={想怎么赋都行}};
    int a[50];
};

#11


C++11 非静态数据初始化

class A{

int x{20};
int a[100]{1,2,3,4,5,.......};//等号也不需要了
};

#12


c++11支持in-class初始化了。
不过楼主这种,在构造函数中初始化就可以了吧。

A::A() {
    memset(a, 0, sizeof(a));
}

#1


C++ 11 是支持 类内初始化的,意味着你安装的如果是vs2013就没这个问题了

按你的情况,可以在构造函数的初始化列表中初始化.

#2


能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)

#3


印象中,静态常量整型数据成员只分配一次空间

#4


在构造函数的初始化列表中 似乎也不能初始化数组,除非用统一初始化{}  但这个也不支持

所以,在构造函数中 memset  之类的 手动修改内存值吧

#5


使用memset根你的{0}实际是一个效果.
你自己可以使用反汇编看看, 其实={0}在数组元素比较多的时候就会被编译成memset.

#6


int Val[0x100] = {0};
010B55A2  mov         dword ptr [Val],0 
010B55AC  push        3FCh 
010B55B1  push        0    
010B55B3  lea         eax,[ebp-404h] 
010B55B9  push        eax  
010B55BA  call        memset (115BDD0h)   //memset调用
010B55BF  add         esp,0Ch 

#7


int a[50] = {};

#8


C++11 之前的标准
只有静态常量整型数据成员,才可以在类中初始化。

这是因为,当时认为,类定义中的数据定义,是一种声明,不是数据定义。
当用类 定义对象(变量,常量)时候,才开始定义数据。

静态常量整型数据成员
1)不是对象的一部分
2)可以产生常量表达式,所以可以在类中初始化。---否则,用它作为数组的大小,就不合适了。
静态常量整型数据成员,能够用来当作常量表达式使用,
不在内部定义的话,则该常量表达式未定义,就不能使用了。

C++11 非静态成员变量(常量),可以直接初始化,或者在初始化表中初始化。
C++11 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。

#9


引用 2 楼 OmnipotentYouth 的回复:
能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)

在构造函数中初始化

#10


引用 2 楼 OmnipotentYouth 的回复:
能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)

class A
{
public:
    A(){a[50]={想怎么赋都行}};
    int a[50];
};

#11


C++11 非静态数据初始化

class A{

int x{20};
int a[100]{1,2,3,4,5,.......};//等号也不需要了
};

#12


c++11支持in-class初始化了。
不过楼主这种,在构造函数中初始化就可以了吧。

A::A() {
    memset(a, 0, sizeof(a));
}