动态内存分配......这种类型的inititlization怎么样?

时间:2015-02-21 06:11:36

标签: c++

要在堆上创建一个整数并将其初始化为值5,我们执行:

int* a = new int(5);

要在堆上创建一个包含5个整数的数组,我们可以:

int* a = new int[5];            

但是,如果我们想要创建一个包含5个整数的数组,并在一条指令中将每个整数初始化为10,那么它有可能吗?

为了让事情变得更有趣,我们假设数组大小只在运行时才知道。那怎么样?

另外,我知道这是一个非常微不足道的问题,但是我从Java过渡到有时会与C ++混淆,所以...如果在声明期间没有初始化,那么与Java不同,C ++原语数据类型没有使用默认值初始化,并且包含垃圾值,对吧?

但有人告诉我,如果将它们声明为全局变量,那么它们会被初始化为默认值,就像在Java中一样......也是如此吗?为什么呢?

6 个答案:

答案 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