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

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

  •  
  •   zhangchongjie ·
    778280151 · 2021-07-09 16:53:24 +08:00 · 1731 次点击
    这是一个创建于 1232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看到模板类,有些奇怪的想法. 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  
       2021-07-09 17:18:50 +08:00
    不要把指针和数组搞混了
    codyfeng
        2
    codyfeng  
       2021-07-09 17:19:16 +08:00 via Android
    T *foo = new T; 这是 C 语言就有的语法。
    在 C++里如果 T 不是 POD,还会调用 T()
    codyfeng
        3
    codyfeng  
       2021-07-09 17:21:33 +08:00 via Android
    @codyfeng 纠正,new 是 C++语法。不能编辑有点麻烦
    zvl0reqglvd
        4
    zvl0reqglvd  
       2021-07-09 17:30:54 +08:00
    array<int *, 6> intarray; 这个是 array 保存的是 int*类型的指针。
    array<int, 4> *intarray = new array<int, 4>; 这里的 intarray 是一个指针。
    ipwx
        5
    ipwx  
       2021-07-09 17:54:06 +08:00
    首先,楼主你要搞懂,array 在 C++ 不是基础类型,是模板类型。你自己也能写出一个 array 。

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

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

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

    这么说吧,array<...> 是特殊设计,new (堆对象)和栈对象才是 C++ 的根本原理。
    zhangchongjie
        15
    zhangchongjie  
    OP
       2021-07-13 16:59:26 +08:00
    @ipwx 哈哈,知道 array 不能 new,就是突然有这种想法
    ipwx
        16
    ipwx  
       2021-07-14 11:36:25 +08:00
    @zhangchongjie 你好,C++ 几乎任何对象都是可以 new 的。只是 array 设计上就是给不想 new 的人用的。
    ipwx
        17
    ipwx  
       2021-07-14 11:36:40 +08:00
    你想 new 一个 array,没问题,随便你。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2774 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:08 · PVG 21:08 · LAX 05:08 · JFK 08:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.