c++ - 为什么 c++ 使用 CustomClass** 而不是 CustomClass* 来创建返回 CustomClass 指针列表的函数?
问题描述
所以我正在学习 C++ 的基础知识,并且我有这个自定义类
class DataBook{
private:
vector<PersonData> dataList;
PersonData* numList[10];
PersonData* nameList[10];
public:
PersonData** getNumList(){
return this->numList;
}
我只是不明白为什么我们使用PersonData**
而不是PersonData*
. 我知道这应该是PersonData**
因为错误报告是这样说的。但我无法理解这个原因背后的逻辑。谢谢!
解决方案
当您传递(或返回)一个数组时,实际通过的是指向该数组第一个元素的指针。
而且,由于您有一个元素数组,指向该PersonData*
数组第一个元素的指针的类型为.PersonData**
这应该有望回答您的直接问题。
但是,我也想借此机会警告您,不要成为 C+ 程序员,那种似乎用 C++ 编写 C 代码的奇怪品种 :-)
尽管 C++ 最初是基于C 的,但人们常说(嗯,我说得不少)最难教 C++ 的人是 C 开发人员。
如果有人想成为 C++ 开发人员,他们应该尝试完全接受 C++“思维模式”,包括考虑与您的代码相关的以下几点:
如果您传递的指针总是指向一个实际的项目(而不是可能是
NULL
/nullptr
),那么您几乎肯定做错了。这就是创建引用的全部原因,我渴望将它们引入 C 的日子,即使只是在函数调用中进行传递引用。如果您将数据隐藏在类的私有部分后面,那么使用公共 API 将其暴露给任意修改可能是个坏主意。
numList
当我可以做的时候,您尝试的保护是相当无关紧要的auto x = obj.GetNumList(); x[0] = nullptr;
。如果你必须这样做,你至少应该返回一个指针const
来清楚地表明它不应该被修改。std::vector
您甚至应该考虑用或替换您的基本级别数组,std::array
因为它们都提供了防止修改超出范围的元素的保护,并且还使用对象传递大小信息,这是您使用原始指针无法获得的。
推荐阅读
- python - 分布的积分返回 nan 值
- javascript - axios如何获取tree json并渲染一个vue页面?
- javascript - 如何简化 JavaScript/React
- maven - 在参数中使用带有连字符的 maven exec 插件
- android - 相机预览在预览中拉伸/挤压
- java - GetStringExtra 总是返回 null
- angular - RXJS 6.0:./node_modules/rxjs-compat/_esm5/add/operator/publishReplay.js 中的错误
- mql4 - 尝试读取文件时 MQL4 错误 5004 和 5002
- android - Android studio升级到3.2后出现startup failed:initialization script '/tmp/ijinit.gradle'错误
- java - 如何递归删除列表中具有特定值的节点