项目 |
概述 |
语言 |
特性 |
备注 |
基本类型 |
整数、浮点数 |
C++ |
整数类型宽度不固定,如 int,自动数值类型转换 | |
Java |
没有无符号整数,存在装箱Box类型 | |||
C# | ||||
Swift |
基本 tuple 类型 | |||
Kotlin |
T? 是 Box 的 | |||
Dart | ||||
运算符 |
赋值、流程、算术、位、逻辑、关系运算符 |
C++ |
取址运算符,指针运算符,函数运算符 | |
Java | ||||
C# | ||||
Swift |
赋值运算符没有返回值 | |||
Kotlin |
位运算符通过一些方法实现,比如:xor() | |||
Dart | ||||
字符及字符串 |
字符串字面量 |
C++ |
没有指定的字符集 | |
Java | ||||
C# | ||||
Swift |
单字符也用 ”“,多行""" | |||
Kotlin |
多行""" | |||
Dart | ||||
集合类型 |
数组、字典 |
C++ |
内置数组是特殊类型,T t[],不同于 std::array<T> | |
Java | ||||
C# | ||||
Swift |
数组形式:类型 [T],字典形式:类型 [K:V] | |||
Kotlin |
Array 固定长度,ArrayList 可变长度 | |||
Dart | ||||
控制流 |
条件、循环、条件分支 |
C++ |
do while | |
Java | ||||
C# | ||||
Swift |
条件部分没有 () 包围,必须有 { } | |||
Kotlin |
when 代替 switch | |||
Dart | ||||
函数 |
支持默认参数 |
C++ |
可变参数使用 va_args 处理 | |
Java | ||||
C# | ||||
Swift |
Argument Label 强制调用者使用参数 label | |||
Kotlin |
支持具名参数传递 | |||
Dart | ||||
闭包 |
函数式编程 |
C++ |
lamda 表达式,指定变量捕捉 | |
Java | ||||
C# | ||||
Swift |
自动管理变量捕捉和生命期,内存;闭包是引用类型 | |||
Kotlin |
lamda 表达式,参数写在 {} 里面 -> 开始代码体,省略参数 it,不可return | |||
Dart | ||||
枚举 |
enum |
C++ |
不支持遍历,可以通过Qt元数据加强 | |
Java | ||||
C# | ||||
Swift |
支持附加值,可以递归附加同类型枚举 | |||
Kotlin |
枚举类,可以实现接口,可以遍历 | |||
Dart | ||||
结构和类 |
类型 |
C++ |
两者没有多大区别,主要体现在访问控制上 | |
Java | ||||
C# | ||||
Swift |
值和引用类型有很大不同 | |||
Kotlin |
数据类 data,主构造器属性,自动生成一些方法,可以解构 | |||
Dart | ||||
属性 |
实例属性 |
Qt/C++ |
属性与方法关联, READ WRITE | |
Java | ||||
C# | ||||
Swift |
Stored属性和Computed属性,没有实例变量 | |||
Kotlin |
后端属性和计算属性,如果引用 field,就是后端属性 | |||
Dart | ||||
方法 |
实例方法 |
C++ |
this 指针 | |
Java | ||||
C# | ||||
Swift |
self 属性 | |||
Kotlin |
中缀表示法 infix | |||
Dart | ||||
下标操作 |
针对类实例使用下标获取子元素,类似数组操作 |
C++ |
支持操作符重载,下标操作符 [] | |
Java | ||||
C# | ||||
Swift |
支持多维下标 | |||
Kotlin | ||||
Dart | ||||
继承 |
override |
C++ |
支持跨级调用基类的方法 | |
Java | ||||
C# | ||||
Swift |
调用 super 方法 | |||
Kotlin |
需要明确 open/override | |||
Dart | ||||
构造 |
属性默认值 |
C++ |
自动生成拷贝构造 | |
Java | ||||
C# | ||||
Swift |
没有 new 关键字 | |||
Kotlin |
没有 new 关键字 | |||
Dart | ||||
析构 |
自动生成析构 |
C++ |
支持虚析构,可以 delete 基类指针 | |
Java | ||||
C# | ||||
Swift |
没有 delete 关键字,自动引用计数 | |||
Kotlin | ||||
Dart | ||||
可选值链 |
内置的 optional 类型(属性,参数,返回值) |
C++ |
没有语言内置的 optional 类型 | |
Java | ||||
C# | ||||
Swift | ||||
Kotlin | ||||
Dart | ||||
异常处理 |
抛出异常 |
C++ |
任意类型实例都可以作为抛出,但是建议 std::exception 派生类 | |
Java |
抛出 Error、Exception 派生类实例 | |||
C# | ||||
Swift |
抛出满足 Error 协议的实例 | |||
Kotlin | ||||
Dart | ||||
类型转换 |
继承体系的向上、向下转换 |
C++ |
一般没有运行时类型信息,Qt 元数据是一个替代 | |
Java | ||||
C# | ||||
Swift |
有运行时类型信息,转换可能失败 as? as! | |||
Kotlin | ||||
Dart | ||||
嵌套类型 |
类型、方法内定义嵌套类型 |
C++ | ||
Java |
支持访问外部类的成员,static 嵌套不支持 | |||
C# | ||||
Swift | ||||
Kotlin |
嵌套类 inner,可以访问外部类成员 | |||
Dart |
支持访问外部类的成员 | |||
扩展 |
扩展属性,方法,嵌套类型 |
C++ |
不支持扩展 | |
Java |
接口 default 方法 | |||
C# | ||||
Swift |
可以为空对象 T? 扩展方法 | |||
Kotlin | ||||
Dart |
extension | |||
协议(接口) |
不实现协议的成员(属性,方法) |
C++ |
没有纯粹的接口,支持用纯虚函数;支持多继承,虚拟继承 | |
Java | ||||
C# | ||||
Swift |
构造函数也可以作为协议要求 | |||
Kotlin |
接口 interface ,可以实现方法、计算属性 | |||
Dart | ||||
泛型 |
泛型函数 |
C++ |
不支持 where 约束,模板编译时不检查,实例化时会报错 | |
Java | ||||
C# | ||||
Swift |
协议的附加类型 associatedtype ,可以带约束, where 约束 | |||
Kotlin | ||||
Dart | ||||
自动引用计数 |
强引用,弱引用 |
C++ |
通过库实现 | |
Java |
在语言层面默认强引用,弱引用通过库实现 | |||
C# | ||||
Swift |
在语言层面默认强引用,支持弱引用 | |||
Kotlin | ||||
Dart | ||||
访问控制 |
类型访问控制 |
C++ |
没有包、文件访问控制,protected 权限用于派生类访问基类 | |
Java |
没有文件访问控制,protected 权限用于派生类访问基类 | |||
C# | ||||
Swift |
默认 internal 包内可访问 | |||
Kotlin |
没有文件单元的权限 | |||
Dart | ||||
反射 |
表示类型的类型 |
C++ |
一般不使用运行时类型信息 rtti,使用 Qt 元数据信息 | |
Java | ||||
C# | ||||
Swift |
let metatype : X.Type = X.self | |||
Kotlin | ||||
Dart | ||||
协程 |
C++ | |||
Java | ||||
C# | ||||
Swift | ||||
Kotlin | ||||
Dart |