V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhangchongjie
V2EX  ›  C++

c++ 模板类 array 的一些问题

  •  
  •   zhangchongjie · 102 天前 · 864 次点击
    这是一个创建于 102 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看到模板类,有些奇怪的想法. array<int *, 6> intarray; 会有一个 array 对象,可以用数组的方式赋值. 但是为什么
    array<int, 4> *intarray = new array<int, 4>; 这样返回的是一个类似二位数组的对象? 看源码的构造参数也没看出个所以然,小白没弄明白,求解释

    17 条回复    2021-07-14 11:36:40 +08:00
    jmc891205
        1
    jmc891205   102 天前
    不要把指针和数组搞混了
    codyfeng
        2
    codyfeng   102 天前 via Android
    T *foo = new T; 这是 C 语言就有的语法。
    在 C++里如果 T 不是 POD,还会调用 T()
    codyfeng
        3
    codyfeng   102 天前 via Android
    @codyfeng 纠正,new 是 C++语法。不能编辑有点麻烦
    zvl0reqglvd
        4
    zvl0reqglvd   102 天前
    array<int *, 6> intarray; 这个是 array 保存的是 int*类型的指针。
    array<int, 4> *intarray = new array<int, 4>; 这里的 intarray 是一个指针。
    ipwx
        5
    ipwx   102 天前
    首先,楼主你要搞懂,array 在 C++ 不是基础类型,是模板类型。你自己也能写出一个 array 。

    T* 是基础的类型,new T(xxx) 表示创建一个新的 T 对象。
    zhangchongjie
        6
    zhangchongjie   99 天前
    @ipwx 嗯嗯,我现在不明白的是 array<int *, 6> intarray; 这样返回一个数组,为什么我 new new array<int, 4>;返回的是一个二维数组对象,按理说 new 确实是返回一个指针变量
    wutiantong
        7
    wutiantong   99 天前
    @zhangchongjie 都不知道该从何讲起了,总觉得你学 C++的姿势有点问题。。。
    zhangchongjie
        8
    zhangchongjie   99 天前
    @wutiantong 哈哈,我现在就看 c++ primer plus 跟着一章章的学,只是看到这个模板类突发奇想,过于纠结,new 会返回内存地址赋给指针,但偏偏 这个模板 array 返回的就是二维的对象啦
    wutiantong
        9
    wutiantong   99 天前
    @zhangchongjie 关键的事情是,你要掌握正确的有效的概念而非错误的无用的概念。那么其实“二维数组 /二维的对象”就是典型的后者。
    std::array<int, 3> * 是二维的?
    不,它是一个指针,这个指针*可以*指向一个类型为 std::array<int, 3>的对象。

    一般意义上来讲,std::array<std::array<int, 3>, 5> 这样子的类型更有资格称为二维数组。
    wutiantong
        10
    wutiantong   99 天前
    @zhangchongjie btw 一般不推荐 primer plus 这本书,推荐的是不带 plus 的那本。
    zhangchongjie
        11
    zhangchongjie   99 天前
    @wutiantong 哈哈....没事,我对指针的理解程度还是不够深,贪多嚼不烂,不带 plus 的好像要更难一些,我把 plus 这本学者敲一边再看会不会有影响?
    ipwx
        12
    ipwx   99 天前   ❤️ 1
    楼主你先别整 std::array<...>, 把 int*, int**, const int*, const int * const 搞清楚在说。
    zhangchongjie
        13
    zhangchongjie   99 天前
    @ipwx 好,**好像这个是二级指针了,我都没学到这里,哈哈,我也就不继续纠结这个模板类了,书中只是说了模板类不需要 new,我钻牛角尖了
    ipwx
        14
    ipwx   98 天前
    @zhangchongjie 呃,你估计是理解错了。

    模板类不需要 new ×
    某些模板类设计上不需要 new √ (比如 array<...>)

    这么说吧,array<...> 是特殊设计,new (堆对象)和栈对象才是 C++ 的根本原理。
    zhangchongjie
        15
    zhangchongjie   98 天前
    @ipwx 哈哈,知道 array 不能 new,就是突然有这种想法
    ipwx
        16
    ipwx   98 天前
    @zhangchongjie 你好,C++ 几乎任何对象都是可以 new 的。只是 array 设计上就是给不想 new 的人用的。
    ipwx
        17
    ipwx   98 天前
    你想 new 一个 array,没问题,随便你。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3772 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 08:05 · PVG 16:05 · LAX 01:05 · JFK 04:05
    ♥ Do have faith in what you're doing.