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

2021-07-09 16:53:24 +08:00
 zhangchongjie

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

1763 次点击
所在节点    C++
17 条回复
jmc891205
2021-07-09 17:18:50 +08:00
不要把指针和数组搞混了
codyfeng
2021-07-09 17:19:16 +08:00
T *foo = new T; 这是 C 语言就有的语法。
在 C++里如果 T 不是 POD,还会调用 T()
codyfeng
2021-07-09 17:21:33 +08:00
@codyfeng 纠正,new 是 C++语法。不能编辑有点麻烦
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
2021-07-09 17:54:06 +08:00
首先,楼主你要搞懂,array 在 C++ 不是基础类型,是模板类型。你自己也能写出一个 array 。

T* 是基础的类型,new T(xxx) 表示创建一个新的 T 对象。
zhangchongjie
2021-07-13 10:02:44 +08:00
@ipwx 嗯嗯,我现在不明白的是 array<int *, 6> intarray; 这样返回一个数组,为什么我 new new array<int, 4>;返回的是一个二维数组对象,按理说 new 确实是返回一个指针变量
wutiantong
2021-07-13 10:44:31 +08:00
@zhangchongjie 都不知道该从何讲起了,总觉得你学 C++的姿势有点问题。。。
zhangchongjie
2021-07-13 11:32:45 +08:00
@wutiantong 哈哈,我现在就看 c++ primer plus 跟着一章章的学,只是看到这个模板类突发奇想,过于纠结,new 会返回内存地址赋给指针,但偏偏 这个模板 array 返回的就是二维的对象啦
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
2021-07-13 11:54:08 +08:00
@zhangchongjie btw 一般不推荐 primer plus 这本书,推荐的是不带 plus 的那本。
zhangchongjie
2021-07-13 11:57:52 +08:00
@wutiantong 哈哈....没事,我对指针的理解程度还是不够深,贪多嚼不烂,不带 plus 的好像要更难一些,我把 plus 这本学者敲一边再看会不会有影响?
ipwx
2021-07-13 14:05:24 +08:00
楼主你先别整 std::array<...>, 把 int*, int**, const int*, const int * const 搞清楚在说。
zhangchongjie
2021-07-13 14:18:40 +08:00
@ipwx 好,**好像这个是二级指针了,我都没学到这里,哈哈,我也就不继续纠结这个模板类了,书中只是说了模板类不需要 new,我钻牛角尖了
ipwx
2021-07-13 16:56:13 +08:00
@zhangchongjie 呃,你估计是理解错了。

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

这么说吧,array<...> 是特殊设计,new (堆对象)和栈对象才是 C++ 的根本原理。
zhangchongjie
2021-07-13 16:59:26 +08:00
@ipwx 哈哈,知道 array 不能 new,就是突然有这种想法
ipwx
2021-07-14 11:36:25 +08:00
@zhangchongjie 你好,C++ 几乎任何对象都是可以 new 的。只是 array 设计上就是给不想 new 的人用的。
ipwx
2021-07-14 11:36:40 +08:00
你想 new 一个 array,没问题,随便你。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX