c++ - 模板类初始化的问题
PHP中文网
PHP中文网 2017-04-17 14:17:43
0
1
352
#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中文网
PHP中文网

认证0级讲师

Antworte allen(1)
洪涛

C++中,结构体和类的初始化方式是完全相同的。
如果结构体或类没有public之外的成员变量,且没有提供构造函数,那么可以使用{}的方式来进行初始化。
若有privateprotected的成员变量,或是提供了构造函数,则必须使用构造函数来进行初始化。

至于这里为什么可以使用这种方式来初始化这个数组,因为这里只有一个成员变量,就是这个数组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再试试,就不行了。

因为{}的初始化是按照顺序来的,而类中的数组,实际上就是多个相同类型的元素的放在一起,所以初始化的时候可以按照顺序来,也就不需要再添加一个{}来放在里面了。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage