请注意,我正在学习Visual C ++。
据我所知,我们应该以这种方式将动态数组归零:
void main()
{
int *arr = new int[15];
memset(arr,0,15*sizeof(*arr));
...
delete [] arr;
}
但我找到了另一种方法:
void main()
{
int *a = new int[15]();
...
delete [] arr;
}
如您所见,我在括号后添加了两个括号。但它只有在我设置数组的大小时才有效。
我找不到任何关于此的信息,我不知道这需要什么目的。
编辑:第一个代码现在由VC编译器编辑和验证。 EDIT2:所以我在MSDN上找不到关于第二代码的手册。在那里我可以找到这个? (没有谷歌PLZ)
答案 0 :(得分:8)
确实,添加括号指定值初始化,将int
等简单类型设置为零。
第一个片段(或者在编辑问题之前)是错误的,原因有两个:
new int[15]
一般情况下,不要乱用低级内存分配;使用友好的类型,为您记忆:
#include <vector>
int main() { // 'void' is also wrong here
std::vector<int> arr(15); // dynamic array of 15 'int' values, zero-initialised
// no need to delete anything
}
答案 1 :(得分:0)
我找不到任何关于此的信息,我不知道这需要什么目的。
这是初始化代码,在语言中引入(如果我没记错的话),允许在编写模板和类时将本机类型视为泛型类型。
以下是一个例子:
struct S { int x; S(int a) : x(a) {} }; // structure with constructor taking an int
// observe constructor syntax for int member
// example factory function (not very usefull in practice but good example)
template<typename T>
T make_instance( int x ) { return T(x); /* use old syntax for constructor call */ }
auto s = make_instance<S>(10); // create S instance with value 10
auto i = make_instance<int>(10); // create integer with value 10
在此示例中,模板构造任何类型的实例,该实例支持采用int的构造函数。第二个示例(初始化int
)仅在语言支持使用以下语法初始化整数时才有效:
int x(10);
这是构造函数语法。该语言还支持为本机值调用“默认构造函数”(即调用不带参数的构造函数,对于int
,将值设置为零)。在您的示例中就是这种情况(调用default implicit int“constructor”)。