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

2 c++ arrays constants

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

\n\n

Test.cpp:23:10: 错误:从 \xe2\x80\x98const int*\xe2\x80\x99 到 \xe2\x80\x98int*\xe2\x80\x99 [-fpermissive] 返回数组无效转换;

\n\n
#include <iostream>\n#include <stdio.h>\n\n#define MAX_ELEMENTS 5\nclass CBase\n{\n\npublic:\n    CBase()\n    {\n        for(int i = 0; i < MAX_ELEMENTS; i++)\n        {\n            array[i] = 0;\n        }\n    }\n    ~CBase()\n    {\n        // Nothing\n    }\n    int * GetArray() const\n    {\n        return array;\n    }\n\nprivate:\n    int array[MAX_ELEMENTS];\n\n};\n\nint main ()\n{\n    CBase b;\n    return 1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
#include <iostream>\n#include <stdio.h>\n\nclass CBase\n{\npublic:\n    CBase():ptr(NULL)\n    {\n    }\n    ~CBase()\n    {\n        delete ptr;\n    }\n    int * ptr;\npublic:\n    int * GetPtr() const\n    {\n        return ptr;\n    }\n};\n\nint main ()\n{\n    CBase b;\n\n    return 1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

sig*_*igy 5

想象一下这样的代码:

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

正如评论中已经提到的,它确实破坏了代码的常量正确性。您需要做的是将 GetArray() 声明为非 const,或者使其返回指向 const int 的指针。

const int * GetArray() const 
{
    return array;
}
Run Code Online (Sandbox Code Playgroud)

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

const CBase b;
const int *array = b.GetArray();
array[0] = 5;
Run Code Online (Sandbox Code Playgroud)

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