#include <cstddef>
template <class T, size_t N>
struct block
{
typedef T value_type;
typedef value_type* pointer;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef ptrdiff_t diffrence_type;
typedef size_t size_type;
typedef pointer iterator;
typedef const pointer const_iterator;
iterator begin() { return data;}
iterator end() { return data + N;}
const_iterator begin() const { return data;}
const_iterator end() const { return data + N;}
reference operator[](size_t n) { return data[n];}
const_reference operator[](size_type n) const { return data[n];}
size_type size() const { return N;}
T data[N];
};
int main()
{
block<int, 6> A = {1, 4, 2, 8, 5, 7};
return 0;
}
在main函数里,对这个变量进行了初始化。书上说,以这种方式初始化,必须符合某种限制:struct 不能拥有使用者声明的任何constructo,也不能拥有任何private或protected member。block是满足这些限制的,那么为什么满足了这些限制后,就可以以这种方式去初始化结构体里面的数组?
在
C++
中,結構體和類別的初始化方式是完全相同的。如果結構體或類別沒有
public
之外的成員變量,且沒有提供建構函數,那麼可以使用{}
的方式來進行初始化。若有
private
或protected
的成員變量,或是提供了構造函數,則必須使用構造函數來進行初始化。至於這裡為什麼可以用這種方式來初始化這個數組,因為這裡只有一個成員變量,就是這個數組data。
block<int, 6> A = {1, 4, 2, 8, 5, 7};
這一句比較規範的寫法是block<int, 6> A = {{1, 4, 2, 8, 5, 7}};
。你可以在
T data[N]
前面加一個T* p
再試試,就不行了。因為
{}
的初始化是按照順序來的,而類別中的數組,實際上就是多個相同類型的元素的放在一起,所以初始化的時候可以按照順序來,也就不需要再添加一個{}
來放在裡面了。