为什么数组参数被视为const数组?

时间:2013-07-29 22:32:04

标签: c++ arrays arguments const

我正在使用一个成员函数,它只是将对象的内部方向设置为参数中给出的值:

void A::SetOrientation(float a[3]);

在另一堂课中,我有以下内容:

class B
{
public:
  RestoreStateTo(A* const o_pA) const
private:
  float d_orientation[3];
};

void 
B::RestoreStateTo(A* const o_pA) const
{
   o_pA->SetOrientation(d_orientation);
}

我得到以下编译器错误(使用Visual Studio 2010):

error C2664: 'void A::SetOrientation(float [])' : cannot convert parameter 1 from 'const float [3]' to 'float []'

我发现我可以避免o_pA->SetOrientation(const_cast<float *>(d_orientation));的问题,但我想更好地掌握正在发生的事情。

我希望解释为什么数组参数转换为const数组以及建议处理错误的正确方法?

3 个答案:

答案 0 :(得分:2)

因为函数的原型void B :: RestoreStateTo(A * const o_pA)const表示你不会修改B的任何成员。 由于d_orientation是B的一个属性,因此它在此函数中是常量。

答案 1 :(得分:0)

你的SetOrientation函数应该包含一个const,

void A::SetOrientation(const float a[3]);

否则,A :: SetOrientation可能会修改你传入的数组。因为你有“B :: RestoreStateTo(A * const o_pA) const ”,这意味着编译器赢了不允许将指针传递给B :: d_orientation作为非const输入,因为A :: SetOrientation不保证不修改它。

答案 2 :(得分:-1)

您已声明const成员函数,因此this的所有成员将在该函数内被视为const。因此d_orientation被视为const并不奇怪。

这个原则使得此代码非法:

const B* p = ...;
p->d_orientation[0] = 0.0f; // error, assigning member of `const` object