gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:54:49 25 4
gpt4 key购买 nike

为什么下面的代码会报错

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com