关于C++中Class的私有成员

About private member of Class in C++

本文关键字:成员 Class C++ 关于      更新时间:2023-10-16

我有一个关于C++中class的私有成员的问题:

我有一个这样定义的类:

class Hello
{
private:
int a[2][2] = {{1,1},{2,2}};
public:
int* getA();
} hello;

a是一个数组,它是类hello的私有成员,它受到保护,不会从类外访问,但如果我使用getA()返回数组a的地址,如下所示:

int* Hello::getA()
{
return &a[2][2];
}

并且类之外的CCD_ 3使用一个变量来保持CCD_

int* i = getA();

ia[2][2]的地址吗?我们可以像这样在类外修改arraya[2][2]是否仍受private关键字保护

发生的情况是,您返回了一个指向私有成员的指针。一旦调用方拥有该指针,他们就可以自由地修改指向的数组元素。没有保护,private不再相关。

此外,你无法控制调用方对该指针做什么,也无法控制它们保持该指针的时间。如果有一些a不变量需要强制执行,你就无法执行。如果a是动态分配的,并且您需要重新分配它,则不能。

这很好地证明了为什么向私人成员泄露指针通常不是一个好主意。

(这里,我假设您想要返回一个指向有效元素的指针;a[2][2]是越界的。)

如果我不想修改值,只想读取数组的值,有更好的方法吗?

在这种情况下,可以通过值或const引用返回元素(也可以通过const指针返回,但这会使调用方感到不必要的尴尬)。

由于&a[2][2]访问无效索引,您会遇到未定义的行为

除此之外,private主要是程序员的一个关键字,它不强制执行运行时检查。

据我所知,您必须为二维数组返回一个双指针。

int ** Hello::getA()
{
&a[0][0];
}

你可以自由地进行

myHello.getA()[1][1] = value; //better use pointer just in place than storing it anywhere anyway.

顺便说一下,数组是基于0的索引,所以如果您声明

int a[5];

最大可寻址索引是a[4](您有5个内存位置从0开始,而不是从1开始。因此您有一个[0]、一个[1]、一个[2]、一个[3]、一个[4])。

无论如何,在你知道自己在做什么之前,返回原始指针不是一个很好的练习。

还要注意中的返回

return &a[1];// is wrong (if you have a[2])

因为如果你做

Hello.getA()[1];

实际上,您正试图访问a[2],而a[2]是无效的,因为您最多有a[1](a[1]是第二个值,同样a[1]意味着第二个数值相对于第二值wich是第三个数值!)

如果你幸运的话,这只会给你一个分段错误。如果你运气不好,你将不得不搜索和调试为什么在某个时候会得到未定义的值。