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

全部回覆(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再試試,就不行了。

因為{}的初始化是按照順序來的,而類別中的數組,實際上就是多個相同類型的元素的放在一起,所以初始化的時候可以按照順序來,也就不需要再添加一個{}來放在裡面了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板