为什么下面的代码会给我一个错误
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;
}
答案 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>