为何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
相关产品推荐
相关产品推荐

