为什么c ++使用CustomClass **而不是CustomClass *来创建返回CustomClass指针列表的函数?

时间:2018-05-07 02:14:25

标签: c++

所以我正在学习c ++的基础知识,我有这个自定义类

class DataBook{
private:
    vector<PersonData> dataList;
    PersonData* numList[10];
    PersonData* nameList[10];
public:
PersonData** getNumList(){
    return this->numList;
    }

我无法理解为什么我们使用PersonData**代替PersonData*。 我知道它应该是PersonData**,因为错误报告是这样说的。但我无法理解这个理由背后的逻辑。谢谢!

2 个答案:

答案 0 :(得分:2)

当你传递(或返回)一个数组时,实际得到的是指向所述数组的第一个元素的指针。

并且,由于您有一个PersonData*元素数组,指向 数组的第一个元素的指针属于PersonData**类型。

这应该有希望回答你当前的问题。

但是,我也想借此机会警告你成为一名C +程序员,这个奇怪的品种似乎用C ++编写C代码: - )

虽然C ++最初是基于,但它经常说(好吧,说它相当多)最难教C ++的人是C开发人员。

如果有人想成为C ++开发人员,他们应该尝试完全接受C ++&#34; mindset&#34;,包括考虑与您的代码相关的以下几点:

  • 如果你传递的指针总是会引用一个实际的项目(而不是NULL / nullptr),你几乎肯定会这样做错误。这就是创建引用的全部原因,我渴望将它们引入C中的日子,即使只是在函数调用中进行引用传递。

  • 如果您将数据隐藏在某个类的私有部分后面,则可能是错误的想法将其暴露给使用公共API的任意修改。当我numList时,您对auto x = obj.GetNumList(); x[0] = nullptr;的保护尝试是无关紧要的。如果你必须这样做,你应该在至少返回指向const的指针,以清楚地表明它不应该被修改。

  • 您甚至应该考虑用std::vectorstd::array替换基础级别数组,因为这两个数组都提供了修改超出范围元素的保护,并传递了大小信息< em> with 对象,你不能用原始指针获得的东西。

答案 1 :(得分:0)

在你的getNumList()函数中,你想返回一个指针数组。 在C ++中返回函数数组的有效方法是返回指向第一个元素的指针(通常)。

因此,指针数组变为指向指针的指针(第一个元素)。

想想你什么时候有一个整数数组:

int *return_array(int ray[2])
{
    return ray; // OR return &ray OR return &ray[0]
}

现在假设我们有整数指针代替整数,它将成为:

int **return_array(int *ray[2])
{
    return ray; // OR return &ray OR return &ray[0]
}