我有一个带有二维整数数组的类,该数组实现为 int **。我为这个二维数组实现了一个访问器函数,如下所示,返回一个 const int** 以防止用户对其进行编辑:
const int** Class::Access() const
{
return pp_array;
}
但是我得到了编译错误“从 int** 到 const int** 的无效转换”。为什么这里不允许对 const 的提升?如何在没有编辑权限的情况下授予用户访问信息的权限?
我有一个带有二维整数数组的类,该数组实现为 int **。我为这个二维数组实现了一个访问器函数,如下所示,返回一个 const int** 以防止用户对其进行编辑:
const int** Class::Access() const
{
return pp_array;
}
但是我得到了编译错误“从 int** 到 const int** 的无效转换”。为什么这里不允许对 const 的提升?如何在没有编辑权限的情况下授予用户访问信息的权限?
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!
我误认为const
方法的正确性是错误的原因。正如 Ben 指出的那样,const
该方法的 -ness 是无关紧要的,因为它仅适用于外部指针 [指向int
s 的指针] 的值,可以轻松地将其复制到可变版本。
为了保护数据(这是您的首选结果),您应该使int
s 和指向int
s 的指针都保持不变:
int const * const * Class::Access() const
{
return pp_array;
}
将工作。
如果您更喜欢将 const 放在前面,您也可以像这样编写声明:
const int * const * Class::Access() const;
但由于第二个const
适用于指针,它必须放在const
星号的右边(就像适用于方法的那个)。