Jay*_*esh 14 c++ initialization new-operator dynamic-memory-allocation c++11
如果我们写下这样的话:
int *arr = new int[5];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,系统为5个类型的元素动态分配空间,int并返回指向序列的第一个元素的指针.
但是,一旦我看到以下代码:
int *arr = new int[5]{};
Run Code Online (Sandbox Code Playgroud)
那么,运营商{}之后的意义new何在?{}这段代码的目的是什么?
我用自己的值初始化了数组,如下所示:
#include <iostream>
int main()
{
int* a = new int[5]{1};
for(int i = 0; i < 5; i++)
std::cout<< a[i]<<' ';
delete[] a;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
只有第一个元素打印1.为什么?
Jod*_*cus 22
int *arr = new int[5];
Run Code Online (Sandbox Code Playgroud)
执行缺省初始化(在这种情况下,意味着的元素arr是未初始化的),而
int *arr = new int[5]{};
Run Code Online (Sandbox Code Playgroud)
是一个值初始化(在这种情况下装置的元件arr被初始化为零).请参阅链接中的相应规则.特别是对于后一种情况,阵列将被零初始化.
无论如何,如果没有其他正当理由,应首选使用std :: vector.
编辑:关于你的第二个问题:这是由于初始化规则.你必须写
int* a = new int[5]{1, 1, 1, 1, 1 };
Run Code Online (Sandbox Code Playgroud)
已推荐的std :: vector支持您想要的语法:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> a(5, 1);
for(int i = 0; i < 5; i++)
std::cout<< a[i]<<' ';
}
Run Code Online (Sandbox Code Playgroud)
https://ideone.com/yhgyJg 请注意这里使用()-braces.由于vector有一个std :: initializer_list的构造函数,调用vector {5,1}会产生一定的歧义,如果提供的话,总是优先使用{} -initializations的initializer_list构造函数来解决这个歧义.因此,使用{}将导致创建一个具有值为5和1的2个元素的向量,而不是值为1的5个元素.
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |