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

时间:2015-12-16 14:06:05

标签: c++ constructor initialization primitive

根据我的理解,用c ++实例化一个整数是合法的:

int x = int(5);

作为一名Java程序员,我假设这行代码调用整数传递的构造函数" 5"作为一个论点。我读过虽然int不是一个类,因此没有构造函数。

那么,在那行代码中究竟发生了什么,以及通过这种方式初始化int之间的根本区别是什么:

int x = 5;

提前致谢!

2 个答案:

答案 0 :(得分:11)

  

我读过虽然int不是一个类,因此没有构造函数。

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

  

在该行代码中究竟发生了什么

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

  

初始化int的方式和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以获取更精细的细节和差异。

答案 1 :(得分:2)

当涉及到类型时,C ++和java的工作方式不同。虽然java(据我所知)使用基本的内置类型和引用类型,但C ++使用不同类型的系统。

C ++内置类型包括基本类型(bool,字符类型,如char,整数类型,浮点类型和void)以及一些其他类型,如double&std::vector<std::sting>&&等引用类型和指针类型。

除此之外,C ++还支持用户定义的类型(结构,类,枚举和枚举类)。标准库提供了许多用户定义的类型,例如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);