关于C++中Class的私有成员
About private member of Class in C++
我有一个关于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();
i
有a[2][2]
的地址吗?我们可以像这样在类外修改array
吗a[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是第三个数值!)
如果你幸运的话,这只会给你一个分段错误。如果你运气不好,你将不得不搜索和调试为什么在某个时候会得到未定义的值。
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 是否可以将 std::unordered_map<Class, Class> 作为 Class 的成员?
- Visual Class 在 DLL 中的成员函数中返回自身C++
- 如何将带有 std::vector 成员的类移动到<class>另一个向量<class>中?
- 模板类静态成员变量在使用'extern template class'语法时的特殊化
- 向量<Class>没有成员"函数"
- 非静态成员函数的使用无效(while loop/no class/wget popen)
- 头文件中是否定义了一个很长的Class函数成员
- 关于C++中Class的私有成员
- "class::data member is private"错误,但我正在使用成员函数对其进行操作?
- 错误:'class std::stack<>'没有名为 'pop_back' 的成员
- 为什么constexpr静态成员(类型为class)需要定义
- 错误:'class TermPaper'没有命名的成员
- 如何修复'class android::Surface'没有名为"setDirtyRect"的成员?
- 'class Poco::XML::Element'没有名为'getNodeByPath'的成员
- 微优化:使用局部变量与.class成员进行迭代
- 智能感知说错误:成员"Class::field"无法访问,但它仍然有效?为什么?
- 类没有成员"Class"