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

标签 c++ arrays constants

为什么下面的代码会报错

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 CBase b;
int *array = b.GetArray();
array[0] = 5; // ooops! b changed but we declared it const!?

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

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

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

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

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

关于c++ - 从 const 成员函数返回指向成员数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559731/

相关文章:

c++ - 命名空间内未引用的函数

c++ - 解析h.264的char*数据

c++ - Visual Studio 自动将括号添加到函数名称

PHP:将数据与来自单个数组的共享 key 组合到新数组中

c++ - 使用公共(public)数据初始化多个 C++ 数组

c 制作一个 const 结构数组的副本

c++ - 了解无符号数的行为

arrays - mongodb 添加或更新数组中的对象

c++ - 图像指针指向 C++ 中的指针初始化

c++ - 为什么我不能从 const String& 方法返回 NULL?