我是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
答案 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;