【问题标题】:Why is int x = int(5) legal if int is not a class?如果 int 不是一个类,为什么 int x = int(5) 是合法的?
【发布时间】:2015-12-16 14:06:05
【问题描述】:

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

int x = int(5);

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

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

int x = 5;

提前致谢!

【问题讨论】:

  • 它会将5 转换为int。什么都不做。
  • int(5)function cast expression。它不是特定于初始化的,实际上可以出现在任何允许表达式的地方。
  • @BoBTFish:不,强制转换是括号中的数据类型标识符,后跟表达式。
  • @PavelPájaHalbich C++ 不是 C。您可以通过在参数周围放置括号来进行强制转换。
  • 作为一名 Java 程序员,我会假设 -- 也许这才是真正的问题。 C++ 不是 Java,因此假设 C++ 使用 Java 作为模型是如何工作的只会给你带来麻烦。

标签: c++ constructor initialization primitive


【解决方案1】:

我读到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);一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2020-10-25
    • 1970-01-01
    • 2016-02-26
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多