如果 int 不是 class,为什么 int x = int(5) 是合法的?

Why is int x = int(5) legal if int is not a class?

据我了解,像这样在 C++ 中实例化整数是合法的:

int x = int(5);

作为一名 Java 程序员,我会假设这行代码调用传递“5”作为参数的整数的构造函数。我读到 int 不是 class 因此没有构造函数。

那么,在那行代码中到底发生了什么,以这种方式初始化 int 和这样初始化 int 的根本区别是什么:

int x = 5;

提前致谢!

I read though that int is not a class and thus has no constructor.

是的,技术上 built-in types have no constructor

what does exactly happen in that line of code

整数文字 5 被显式转换为 int(主要是编译器的空操作)并分配给 x.

what is the fundamental difference between initialising the int that way and int x = 5;

本质上,没有区别。在大多数情况下,以下所有表达式都是相同的,除非您是语言律师(例如,最后一个表达式会阻止缩小,即如果值不能由类型表示则引发错误):

int x = 5;         // copy initialization
int y = int(5);    // cast and copy initialization
int z = (int)5;    // cast and copy initialization
int w(5);          // direct initialization
int r{5};          // direct initialization

阅读 more about initializations 了解更详细的信息和差异。

C++ 和 java 在类型方面的工作方式不同。 java(据我所知)使用基本的内置类型和引用类型,而 C++ 使用不同的类型系统。

C++ 内置类型包括基本类型(bool、char 等字符类型、整数类型、浮点类型和 void)以及一些其他类型,例如 double& 或 [=12 等引用类型=] 和指针类型。

除此之外,C++ 还支持用户定义的类型(结构、classes、枚举和枚举 class)。标准库提供了许多用户定义的类型,例如 std::string。

事实证明 int a(5); 表示法不只为用户定义的类型保留,语言支持这种方式的值初始化。在 C++11 中,int a{5};

也是合法的

现在关于赋值:

int a; //declaration
a=5;   //assignment

int b(5); //declaration+initialization
int c=5;  //declaration+initialization (NO assignment)

如果一个变量没有声明,没有赋值,编译器解析int c=5;就像int c(5);