我有一个类,其中一个二维数组的int实现为int **。我按如下方式为这个2D数组实现了一个访问器函数,返回一个const int **以防止用户编辑它:
const int** Class::Access() const
{
return pp_array;
}
但是我得到了编译错误“从int **到const int **的无效转换”。为什么不允许在这里推广const?如何在不编辑权限的情况下授予用户访问信息的权限?
答案 0 :(得分:6)
Greyson是正确的,您要使用const int* const*
,但没有解释原始版本失败的原因。
以下是为什么 int**
与const int**
不兼容的演示:
const int ci = 0;
const int* pci = &ci;
int* pi;
int** ppi = π
const int** ppci = ppi; // this line is the lynchpin
*ppci = pci;
*pi = 1; // modifies ci!
答案 1 :(得分:4)
我错误地认为该方法的const
是导致错误的原因。正如Ben指出的那样,该方法的const
- ness是无关紧要的,因为它仅适用于指向int
s的指针的外部指针的值,可以将其复制到可变版本平凡。
为了保护数据(这是您的首选结果),您应该使int
和指向int
的指针保持不变:
int const * const * Class::Access() const
{
return pp_array;
}
会工作。
如果您希望将const设置在前面,您也可以像这样编写声明:
const int * const * Class::Access() const;
但由于第二个const
适用于指针,因此它必须放在右侧(如适用于该方法的const
)星号。