c++ - 模板类初始化的问题

 米年爱秋天 发布于 2022-11-02 00:55
#include 

template 
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 A = {1, 4, 2, 8, 5, 7};
    return 0;
}

在main函数里,对这个变量进行了初始化。书上说,以这种方式初始化,必须符合某种限制:struct 不能拥有使用者声明的任何constructo,也不能拥有任何private或protected member。block是满足这些限制的,那么为什么满足了这些限制后,就可以以这种方式去初始化结构体里面的数组?

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再试试,就不行了。

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

    2022-11-12 01:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有