要在堆上创建一个整数并将其初始化为值5,我们执行:
int* a = new int(5);
要在堆上创建一个包含5个整数的数组,我们可以:
int* a = new int[5];
但是,如果我们想要创建一个包含5个整数的数组,并在一条指令中将每个整数初始化为10,那么它有可能吗?
为了让事情变得更有趣,我们假设数组大小只在运行时才知道。那怎么样?
另外,我知道这是一个非常微不足道的问题,但是我从Java过渡到有时会与C ++混淆,所以...如果在声明期间没有初始化,那么与Java不同,C ++原语数据类型没有使用默认值初始化,并且包含垃圾值,对吧?
但有人告诉我,如果将它们声明为全局变量,那么它们会被初始化为默认值,就像在Java中一样......也是如此吗?为什么呢?
答案 0 :(得分:2)
我更喜欢:
std::vector<int> a = {10,10,10,10,10};
答案 1 :(得分:0)
这适用于g ++ 4.8.2。
#include <iostream>
int main()
{
int* a = new int[5]{10, 10, 10, 10, 10};
for ( int i = 0; i < 5; ++i )
{
std::cout << a[i] << " ";
}
std::cout << std::endl;
}
输出:
10 10 10 10 10
更新,以回应OP的评论
使用时
std::vector<int> v(5, 10);
使用的std::vector
的构造函数是:
vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
假设你有一个班级
class MyClass
{
public:
MyClass(int ) {}
};
您可以使用
构建std::vector<MyClass>
std::vector<MyClass> v(10, MyClass(50));
或
std::vector<MyClass> v(10, 50);
在第二种情况下,编译器知道如何仅在参数MyClass
的情况下隐式构造临时50
对象。但无论哪种方式,临时MyClass
对象都被传递给vector
,这是正常的,因为该参数的参数类型是const MyClass&
,它可以绑定到临时对象。 / p>
答案 2 :(得分:0)
C ++是一种非常复杂的语言,有许多不同的(甚至是矛盾的)目标。
其背后的一个想法是,你不应该付出你不需要的效率,这就是未初始化价值概念的背后。
写作时
int x;
变量x
如果在全局/命名空间范围内则被初始化,而在定义在本地范围内时不会被初始化。
这不是因为设计C的人是疯了(当然初始化值更好),但是因为它完成了编译/链接,因此从效率的角度来看,全局/命名空间范围内的初始化是 free /加载时间,而不是在运行时。
在本地范围内初始化变量而不是成本(小但非零)和从C继承的C ++如果你不需要它就不应该为它付出代价,因此如果你想要你的变量初始化任何价值只是这样说:
int x = 42;
但是请注意,未初始化的变量不仅仅是“包含垃圾值”,而是未初始化的,并且不允许您读取其内容,因为这样的操作是“未定义的行为”。
有些平台只读取未初始化变量的内容可能会崩溃(“陷阱表示”:例如硬件带有指针的专用寄存器,其中只是在寄存器中放置一个无效地址 - 没有对它做任何事情 - 引发硬件例外)。
答案 3 :(得分:0)
不,不可能使用new[]
分配数组并指定数组元素的初始值。分配完成后,您必须填写数组,例如:
int count = 5;
int* a = new int[count];
for (int i = 0; i < count; ++i)
a[i] = 10;
...
delete[] a;
这不是很C ++ - 是的。您可以使用std::fill()
来摆脱循环,至少:
int count = 5;
int* a = new int[count];
std::fill(a, a+count, 10);
...
delete[] a;
更好的选择是转而使用std::vector
,它有一个完全符合您要求的构造函数:
std::vector<int> a(5, 10); // create 5 elements initialized to value 10
答案 4 :(得分:0)
std::vector
有一个构造函数,您可以在其中指定初始大小和初始值:
std::vector<int> an_array(size, init_value);
如果要使用new[]
使用动态数组,则必须为每个元素分配初始值:
int* array = new a[size];
for(int i = 0; i < size; ++i)
array[i] = init_value;
...
delete[] array;
答案 5 :(得分:0)
如果在编译时已知大小,请使用std::array
:
std::array<int, 5> myArray = { 1, 2, 3, 4, 5 };
符合RAII标准且安全。
您只需要包含<array>
和<initializer_list>
。
在其他情况下,请使用std::vector
。