定义数组时const_cast是否可接受?

时间:2010-10-11 07:04:58

标签: c++ c const const-cast

我有一个静态const数组类成员(指向SDL_Surfaces的常量指针,但这是无关紧要的),并且必须循环遍历它才能填充它。除了const_cast,当我完成循环时,我听说这是不好的做法,我将如何去做呢?

编辑: 我之所以不做的原因......

static SDL_Surface *const myArray[3];
...
class::myArray[3] = {...};

是我需要从不同的数组中读取并在不同数组的相应值上运行函数以获取此数组的值。一旦我一直循环,我永远不会再改变这个数组,所以我看到它的方式,它应该是const。

编辑2: 我想我可能在这里犯了一个概念错误。是否有可能以某种方式使const_cast成为const,而不是删除它的constness,这是我试图做的事情?如果没有,那我就是一个有点傻的问这个:D

5 个答案:

答案 0 :(得分:3)

如果您正在尝试初始化它,如果它是一个数组,只需使用初始化列表:

static const int myarray[] = {1,2,3,4,5,6};

答案 1 :(得分:3)

如果您的数组是const并且您使用const_cast来使您能够在其中写入值,那么您正在调用未定义的行为

这几乎普遍不是一种可接受的做法。

答案 2 :(得分:1)

typedef boost::array< const SDL_Surface *, 100 > surfaces_t;

class A {
   static const surfaces_t surfaces;
};

surfaces_t initialize_surfaces()
{
   // ...
}

const surfaces_t A::surfaces = initialize_surfaces();

至于EDIT 2:声明后不能改变对象的类型。强制转换不会这样做,在C ++中是不可能的。演员所做的是从另一种类型的表达式形成给定类型的表达式,其中适当的语义对于不同类型的强制转换是不同的。对于const_cast,你可以添加/删除const,你可以添加/删除volatile,而不是别的。

答案 3 :(得分:1)

提供“逻辑常量”的一种方法是使数据不可访问,除非通过非变异方式。

例如:

class foo
{
public:
    const bar& get_bar() { return theBar; }

private:
    static bar theBar;
};

即使theBar不是常数,因为foo是唯一可以修改它的东西,只要它正确地执行,你基本上(逻辑上)有一个常量bar

答案 4 :(得分:0)

首先,为什么需要更改声明为常量的内容?