所以想问问:
为什么「只有静态常量整型数据成员才可以在类中初始化」?(好像在其他编译环境下都没有这样的情况啊)
那么我一个很大的数组想全部初始化为零应该如何做? (也就是说不能使用int a[0] = {0};了)
12 个解决方案
#1
C++ 11 是支持 类内初始化的,意味着你安装的如果是vs2013就没这个问题了
按你的情况,可以在构造函数的初始化列表中初始化.
按你的情况,可以在构造函数的初始化列表中初始化.
#2
能否给个简单的例子,例如我想初始化一个含有50个数据的int类型数组,全部初始化为0 该怎么做;)
#3
印象中,静态常量整型数据成员只分配一次空间
#4
在构造函数的初始化列表中 似乎也不能初始化数组,除非用统一初始化{} 但这个也不支持
所以,在构造函数中 memset 之类的 手动修改内存值吧
所以,在构造函数中 memset 之类的 手动修改内存值吧
#5
使用memset根你的{0}实际是一个效果.
你自己可以使用反汇编看看, 其实={0}在数组元素比较多的时候就会被编译成memset.
你自己可以使用反汇编看看, 其实={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
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 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。
只有静态常量整型数据成员,才可以在类中初始化。
这是因为,当时认为,类定义中的数据定义,是一种声明,不是数据定义。
当用类 定义对象(变量,常量)时候,才开始定义数据。
静态常量整型数据成员
1)不是对象的一部分
2)可以产生常量表达式,所以可以在类中初始化。---否则,用它作为数组的大小,就不合适了。
静态常量整型数据成员,能够用来当作常量表达式使用,
不在内部定义的话,则该常量表达式未定义,就不能使用了。
C++11 非静态成员变量(常量),可以直接初始化,或者在初始化表中初始化。
C++11 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。
#9
在构造函数中初始化
#10
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 之类的 手动修改内存值吧
所以,在构造函数中 memset 之类的 手动修改内存值吧
#5
使用memset根你的{0}实际是一个效果.
你自己可以使用反汇编看看, 其实={0}在数组元素比较多的时候就会被编译成memset.
你自己可以使用反汇编看看, 其实={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
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 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。
只有静态常量整型数据成员,才可以在类中初始化。
这是因为,当时认为,类定义中的数据定义,是一种声明,不是数据定义。
当用类 定义对象(变量,常量)时候,才开始定义数据。
静态常量整型数据成员
1)不是对象的一部分
2)可以产生常量表达式,所以可以在类中初始化。---否则,用它作为数组的大小,就不合适了。
静态常量整型数据成员,能够用来当作常量表达式使用,
不在内部定义的话,则该常量表达式未定义,就不能使用了。
C++11 非静态成员变量(常量),可以直接初始化,或者在初始化表中初始化。
C++11 中 初始化非静态成员变量(常量),可以看作赋给变量(常量)一个默认值。
#9
在构造函数中初始化
#10
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));
}