2015-06-16 149 views
0

基本數組初始化我初學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 
+1

C++原始數組無法(直接地)分配。改爲使用'std :: array'。它將原始數組包裹在一個'struct'中。 –

+0

也許[這](http://stackoverflow.com/questions/15603158/error-assigning-to-an-array-from-an-initializer-list)將幫助你 – Noel

+0

一*相似性*是'x'是不是任何情況下的指針,它是一個數組。 – molbdnilo

回答

3

爲什麼這個代碼給出了一個錯誤這個錯誤?

因爲您可能不會分配給數組變量。數組不能被有價值地傳遞給函數或操作符。當在需要指針的上下文中使用時,它們會衰減到指向第一個元素的指針。

僅使用指向每個數組的第一個元素的指針,不可能將數組(或初始化程序列表)複製到另一個數組。這種操作需要有關陣列大小的信息。

有個很好的分析,爲什麼的賦值是不允許的here。這是關於數組到數組的賦值,但我想它也適用於初始化列表。

而如果我們在一行中初始化數組字節x [2] = {78,82}工作正常嗎?

它的工作原理可能是初始化一個數組變量(在這種情況下爲list initialization)。請記住,=根據它是否在聲明或非聲明語句中使用而做了不同的事情。在聲明中它是初始化的語法,在非聲明語句中它是賦值運算符。

這兩種情況下x指針的區別是什麼?

x不是一個指針,它是一個數組。唯一不同的是,在一種情況下,您初始化x中的對象,而在其他情況下,您將其保留爲未初始化狀態,然後嘗試爲其分配初始化程序列表,但這是不可能的。

1

數組沒有賦值運算符。您必須逐個元素從源數組複製到目標數組,例如通過標準算法std::copy或使用標準C函數memcpy或編寫自己的任務循環。或者,您可以使用下標運算符設置數組的各個元素。

但是標準允許初始化初始化列表爲任何其他聚集陣列時,他們就被定義

byte x[] = { 78, 82 }; // valid 
x = { 78, 82 }; // compilation error 

而且這種說法

cout << x << endl; 

沒有意義,因爲這個數組不是零終止,可能會導致未定義的行爲。

但是,您可以使用具有複製賦值運算符的標準類std::array,因爲它是一個類,編譯器爲其隱式生成此運算符。

例如

#include <iostream> 
#include <array> 

typedef unsigned char byte; 

int main() 
{ 
    std::array<byte, 2> x; 
    x = { { 78, 82 } }; 

    std::cout.write(reinterpret_cast<char *>(x.data()), x.size()) << std::endl; 
}