如何通过指针而非下标访问类的数组类型成员属性?
问题分析与解决方案
你的代码存在几个编译错误和逻辑问题,导致无法得到预期结果,以下是具体问题和修正方案:
核心问题
- 类成员访问权限限制:C++中类的成员默认是
private权限,外部无法直接访问fooArray,myFoo.fooArray这种写法会编译失败。 - 数组赋值语法错误:数组名是常量指针,不能直接用
=进行赋值,myFoo.fooArray = {1,2,...};是非法语法。 main函数语法错误:main函数需要写成int main(),必须有括号和返回值类型。
修正方案
方案一:公开数组成员(直接满足指针操作需求)
将fooArray改为public权限,同时用列表初始化正确初始化对象:
class foo { public: // 修改为public权限,允许外部访问数组 int fooArray[10]; int multiplyFirstAndSecondElement() { return *(fooArray) * *(fooArray + 1); } }; int main() { // 用列表初始化对象,直接初始化内部数组(C++11及以上支持) foo myFoo{{1,2,3,4,5,6,7,8,9,10}}; // 外部通过指针访问数组元素,逻辑与类内完全一致 int result = *(myFoo.fooArray) * *(myFoo.fooArray + 1); int resultInternal = myFoo.multiplyFirstAndSecondElement(); // 此时result和resultInternal的值均为2 }
方案二:保持封装性,提供指针访问接口
如果不想公开数组成员,可添加一个返回数组指针的成员函数,兼顾封装性和指针操作需求:
class foo { private: int fooArray[10]; public: // 构造函数:通过传入数组初始化内部fooArray foo(const int initArr[10]) { for (int i = 0; i < 10; ++i) { fooArray[i] = initArr[i]; } } int multiplyFirstAndSecondElement() { return *(fooArray) * *(fooArray + 1); } // 返回数组首元素的指针,允许外部用指针操作数组 int* getFooArray() { return fooArray; } }; int main() { int initArr[] = {1,2,3,4,5,6,7,8,9,10}; foo myFoo(initArr); // 获取数组指针 int* arrPtr = myFoo.getFooArray(); // 用指针计算结果 int result = *arrPtr * *(arrPtr + 1); int resultInternal = myFoo.multiplyFirstAndSecondElement(); // 两者结果均为2 }
说明
两种方案中,外部指针访问数组的逻辑和类内部multiplyFirstAndSecondElement的逻辑完全一致:*arrPtr等价于fooArray[0],*(arrPtr+1)等价于fooArray[1],因此计算结果必然相同。
内容的提问来源于stack exchange,提问作者L. Merbecks
相关产品推荐
相关产品推荐

