初始化列表中的c ++基本数组初始化

时间:2015-06-16 09:38:46

标签: c++

我是c ++的初学者

我认为这是一个微不足道的问题,但我没有找到答案

为什么这段代码会出错?而如果我们将数组初始化为一行 字节x [2] = {78,82}是否正常工作?

两种情况下x指针的区别是什么?

// example: one class, two objects
#include <iostream>
using namespace std;
typedef unsigned char byte;

int main () {
    byte x[2];
    x = {78,82};
    cout << x << endl;
}

我只从netbeans

中收到此错误
error: assigning to an array from an initializer list

2 个答案:

答案 0 :(得分:3)

  

为什么这段代码会出错?

因为您可能无法分配数组变量。数组不能通过值传递给函数或运算符。当在期望指针的上下文中使用时,它们会衰减为指向第一个元素的指针。

仅使用指向每个数组的第一个元素的指针,无法将数组(或初始化列表)复制到另一个数组。此类操作需要有关阵列大小的信息。

为什么不允许分配here进行了很好的分析。它是关于数组赋值的数组,但我想它也适用于初始化列表。

  

如果我们在一行中初始化数组,则字节x [2] = {78,82}正常工作?

它的工作原理是因为您可以初始化一个数组变量(在这种情况下使用list initialization)。请记住,=执行不同的操作,具体取决于它是在声明还是非声明语句中使用。在声明中它是初始化的语法,在非声明语句中它是赋值运算符。

  

两种情况下x指针的区别是什么?

x不是指针,它是一个数组。唯一的区别是,在一种情况下,您在x中初始化对象,而在另一种情况下,您将其保留为未初始化,然后尝试为其分配一个初始化列表,这是不可能的。

答案 1 :(得分:1)

数组没有赋值运算符。您必须逐个元素地从源数组复制到目标数组,例如通过标准算法vagrant up --provider=virtualbox 或使用标准C函数vagrant up --provider=aws 或为任务编写自己的循环。或者,您可以使用下标运算符设置数组的各个元素。

但是,标准允许使用初始化程序列表初始化数组,如同定义

时的任何其他聚合一样
std::copy

此声明

memcpy

没有意义,因为此数组不会以零结尾,从而导致未定义的行为。

但是,您可以使用具有复制赋值运算符的标准类byte x[] = { 78, 82 }; // valid x = { 78, 82 }; // compilation error ,因为它是一个类,编译器会隐式为它生成此运算符。

例如

cout << x << endl;