从const成员函数返回指向成员数组的指针

时间:2014-02-04 17:50:21

标签: c++ arrays const

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

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;
}

3 个答案:

答案 0 :(得分:4)

想象一下这样的代码:

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

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

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

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

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

修改 要从上面的注释中回答您的其他问题:当您调用返回值的方法并将此返回值分配给某个变量时,返回值已复制到您的变量,然后被丢弃。因此,当您的调用代码更改此变量的值时,这对最初返回的值或变量没有影响。这就是const成员函数可以返回某些类的数据成员的原因。但是,当您将指针返回给数据成员时,调用代码可以操作此成员的值。仍然,指针被复制,但即使是复制指向存储类成员的内存位置,因此您可以操纵它的值。

答案 1 :(得分:0)

您的方法应该返回const int*

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

答案 2 :(得分:0)

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

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

原因是如果返回非常量数组,那么当数组作为指针返回时,其值可以通过函数更改,该函数获取其值,因此常量函数间接导致更改值,因此需要返回常量数组。 / p>