Heim > Fragen und Antworten > Hauptteil
#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是满足这些限制的,那么为什么满足了这些限制后,就可以以这种方式去初始化结构体里面的数组?
PHP中文网2017-04-17 14:19:43
在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
再试试,就不行了。
因为{}
的初始化是按照顺序来的,而类中的数组,实际上就是多个相同类型的元素的放在一起,所以初始化的时候可以按照顺序来,也就不需要再添加一个{}
来放在里面了。