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

const构造函数能否创建非const类对象?Dart代码异常现象问询

关于Dart中const构造函数与非const对象的问题解析

首先明确回答:const构造函数完全可以创建非const类对象,咱们来逐一拆解你给出的两段代码问题:

第一段代码报错的原因

你这段代码的问题并不是“const构造函数能不能创建非const对象”,而是反过来——你用const关键字去调用了一个普通构造函数:

class TestConst {
  final num x;
  final num y;
  TestConst(this.x, this.y); // 这是普通构造函数,没有const修饰
}
void main() {
  TestConst myconst1 = const TestConst(1,2); // 错误点在这里
  TestConst myconst2 = const TestConst(1,2);
  print(identical(myconst1, myconst2));
}

Dart的规则是:如果用const修饰对象创建表达式,要求必须调用const构造函数。你的TestConst类只定义了普通构造函数,所以编译器会抛出Cannot invoke a non-'const' constructor where a const expression is expected.的错误。

第二段代码的行为解释

这段代码里的构造函数是真正的const构造函数,而你调用它时没有加const关键字:

class TestConst {
  final num x;
  final num y;
  const TestConst(this.x, this.y); // const构造函数
}
void main() {
  TestConst myconst1 = TestConst(1,2);
  TestConst myconst2 = TestConst(1,2);
  print(identical(myconst1, myconst2)); // 返回false
}

这里的调用方式是创建非const对象——Dart允许你省略const关键字调用const构造函数,但此时每次调用都会生成一个全新的实例,不会复用常量池中的对象,所以identical(myconst1, myconst2)返回false。

如果想要让相同参数的实例复用,只需要在调用时加上const关键字即可:

void main() {
  TestConst myconst1 = const TestConst(1,2);
  TestConst myconst2 = const TestConst(1,2);
  print(identical(myconst1, myconst2)); // 此时返回true
}

核心总结

  • const构造函数有两种调用方式:
    • 带const关键字:生成编译时常量对象,相同参数的实例会被放入常量池复用,identical返回true
    • 不带const关键字:生成普通非const对象,每次调用都会创建新实例,identical返回false
  • 第一段代码的错误是因为用const修饰调用了普通构造函数,和const构造函数创建非const对象的能力无关

内容的提问来源于stack exchange,提问作者NeoZoom.lua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:17:47