【问题标题】:Returning a pointer to an member array from const member function从 const 成员函数返回指向成员数组的指针
【发布时间】:2014-02-04 17:50:20
【问题描述】:

为什么下面的代码给我一个错误

Test.cpp:23:10: 错误:从‘const int*’到‘int*’的无效转换[-fpermissive]返回数组;

#include <iostream>
#include <stdio.h>

#define MAX_ELEMENTS 5
class CBase
{

public:
    CBase()
    {
        for(int i = 0; i < MAX_ELEMENTS; i++)
        {
            array[i] = 0;
        }
    }
    ~CBase()
    {
        // Nothing
    }
    int * GetArray() const
    {
        return array;
    }

private:
    int array[MAX_ELEMENTS];

};

int main ()
{
    CBase b;
    return 1;
}

编辑:我知道我应该返回一个 const int * 但后来我尝试了下面的东西,它工作正常,请求解释允许这个而不允许上面的原因。

#include <iostream>
#include <stdio.h>

class CBase
{
public:
    CBase():ptr(NULL)
    {
    }
    ~CBase()
    {
        delete ptr;
    }
    int * ptr;
public:
    int * GetPtr() const
    {
        return ptr;
    }
};

int main ()
{
    CBase b;

    return 1;
}

【问题讨论】:

  • 当您让调用者修改 const 对象的数据时,确实会破坏 const 正确性。
  • 试试const int * GetArray() const {...}
  • 因为你的 const 方法应该返回 int const* 而不是 int*
  • 但是 const 成员函数如何按原样返回普通变量(即非数组)而没有任何错误?
  • @user3271978,它的工作方式完全相同。您不必返回const int * const,就像您不必返回const double 或其他东西一样。返回值被复制出来。

标签: c++ arrays constants


【解决方案1】:

想象一下这样的代码:

const CBase b;
int *array = b.GetArray();
array[0] = 5; // ooops! b changed but we declared it const!?

正如 cmets 中已经提到的,它确实破坏了代码的 const 正确性。你需要做的是要么声明 GetArray() 非 const,要么让它返回一个指向 const int 的指针。

const int * GetArray() const 
{
    return array;
}

现在,这样的代码无法编译:

const CBase b;
const int *array = b.GetArray();
array[0] = 5;

编辑 从上面的 cmets 中回答您的另一个问题:当您调用返回值的方法并将此返回值分配给某个变量时,返回值将 复制 到您的变量,然后被丢弃。因此,当您的调用代码更改此变量的值时,这对最初返回的值或变量没有影响。这就是为什么 const 成员函数可以返回一些类的数据成员。但是,当您返回一个指向数据成员的指针 时,调用代码可以操作该成员的值。尽管如此,指针还是被复制了,但即使复制指向了存储类成员的内存位置,因此您可以操纵它的值。

【讨论】:

  • 如果bconst,我认为你的例子会更好。
【解决方案2】:

您的方法应该返回 const int*

const int * GetArray() const
{
    return array;
}

【讨论】:

    【解决方案3】:

    很简单,你需要声明 GetArray() 非 const,或者让它返回一个指向 const int 的指针。

    const int * GetArray() const
    {
        return array;
    }
    

    原因是,如果你返回非常量数组,那么数组作为指针返回,所以它的值可以被获取它的值的函数改变,所以常量函数间接导致改变值,所以你需要返回常量数组。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2016-02-26
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多