You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何const对象的私有成员非const?C++编译报错原因咨询

问题解答:const类成员为何无法作为数组大小?

疑问与代码示例

我有一个疑问:既然const对象的私有成员在构造函数初始化后就无法修改,那为何它们不是const的?我是不是忽略了什么?

实际代码如下:

class Maze {
private:
    struct Coordinate {
        int x, y;

        Coordinate(const int &x, const int &y): x(x), y(y) {}
    };

    const Coordinate size;

    bool* structure;

public:
    Maze(const int &size_x, const int &size_y):
    size(size_x, size_y) {
        structure = new bool[(size.x * 2 - 1)][(size.y * 2 - 1)];
    }
};

编译错误信息

使用G以C17标准编译时,出现以下错误:

array size in new-expression must be constant

‘this’ is not a constant expression

原因解析

核心是混淆了运行时常量和编译时常量的本质区别:

  • const Coordinate size是类的const成员,它的值是在运行时创建对象时才确定的——虽然对象初始化后它的值不能修改,但编译器在编译阶段完全不知道它的具体数值,属于运行时常量。
  • C++语法规则明确要求:new表达式中,多维数组除第一维外的其他维度大小必须是编译时常量(也就是编译器在编译期就能确定的固定值)。size.x和size.y是运行时才会被赋值的,编译器没法提前知道它们的值,因此报错。

至于‘this’ is not a constant expression的错误,是因为size是类成员,访问它本质是通过this->size,而this指向的是运行时才创建的对象,编译阶段编译器无法确定this的具体指向,自然没法通过它获取编译期常量。

简单解决思路

如果要动态创建二维数组,有两种常用方案:

  • 用嵌套的动态分配:先创建一维指针数组,再为每个元素分配bool数组,比如structure = new bool*[size.x*2-1]; for(...) structure[i] = new bool[size.y*2-1];(注意要手动释放内存,避免泄漏)。
  • 改用std::vector<std::vector<bool>>,它会自动管理内存,写法更简洁安全,也符合现代C++的编程习惯。

内容的提问来源于stack exchange,提问作者Alison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:57:11