最近看到模板类,有些奇怪的想法.
array<int *, 6> intarray;
会有一个 array 对象,可以用数组的方式赋值.
但是为什么
array<int, 4> *intarray = new array<int, 4>;
这样返回的是一个类似二位数组的对象?
看源码的构造参数也没看出个所以然,小白没弄明白,求解释
1
jmc891205 2021-07-09 17:18:50 +08:00
不要把指针和数组搞混了
|
2
codyfeng 2021-07-09 17:19:16 +08:00 via Android
T *foo = new T; 这是 C 语言就有的语法。
在 C++里如果 T 不是 POD,还会调用 T() |
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 是一个指针。 |
5
ipwx 2021-07-09 17:54:06 +08:00
首先,楼主你要搞懂,array 在 C++ 不是基础类型,是模板类型。你自己也能写出一个 array 。
T* 是基础的类型,new T(xxx) 表示创建一个新的 T 对象。 |
6
zhangchongjie OP @ipwx 嗯嗯,我现在不明白的是 array<int *, 6> intarray; 这样返回一个数组,为什么我 new new array<int, 4>;返回的是一个二维数组对象,按理说 new 确实是返回一个指针变量
|
7
wutiantong 2021-07-13 10:44:31 +08:00
@zhangchongjie 都不知道该从何讲起了,总觉得你学 C++的姿势有点问题。。。
|
8
zhangchongjie OP @wutiantong 哈哈,我现在就看 c++ primer plus 跟着一章章的学,只是看到这个模板类突发奇想,过于纠结,new 会返回内存地址赋给指针,但偏偏 这个模板 array 返回的就是二维的对象啦
|
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> 这样子的类型更有资格称为二维数组。 |
10
wutiantong 2021-07-13 11:54:08 +08:00
@zhangchongjie btw 一般不推荐 primer plus 这本书,推荐的是不带 plus 的那本。
|
11
zhangchongjie OP @wutiantong 哈哈....没事,我对指针的理解程度还是不够深,贪多嚼不烂,不带 plus 的好像要更难一些,我把 plus 这本学者敲一边再看会不会有影响?
|
12
ipwx 2021-07-13 14:05:24 +08:00 1
楼主你先别整 std::array<...>, 把 int*, int**, const int*, const int * const 搞清楚在说。
|
13
zhangchongjie OP @ipwx 好,**好像这个是二级指针了,我都没学到这里,哈哈,我也就不继续纠结这个模板类了,书中只是说了模板类不需要 new,我钻牛角尖了
|
14
ipwx 2021-07-13 16:56:13 +08:00
@zhangchongjie 呃,你估计是理解错了。
模板类不需要 new × 某些模板类设计上不需要 new √ (比如 array<...>) 这么说吧,array<...> 是特殊设计,new (堆对象)和栈对象才是 C++ 的根本原理。 |
15
zhangchongjie OP @ipwx 哈哈,知道 array 不能 new,就是突然有这种想法
|
16
ipwx 2021-07-14 11:36:25 +08:00
@zhangchongjie 你好,C++ 几乎任何对象都是可以 new 的。只是 array 设计上就是给不想 new 的人用的。
|
17
ipwx 2021-07-14 11:36:40 +08:00
你想 new 一个 array,没问题,随便你。
|