
最近看到模板类,有些奇怪的想法. 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 楼主你先别整 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,没问题,随便你。 |