【问题标题】:Why new is an operator in C++为什么 new 是 C++ 中的运算符
【发布时间】:2017-02-08 17:23:11
【问题描述】:

我只是在 operatorkeywords 之间感到困惑。我知道这对编程无关紧要,但我想知道其中的区别。

In Java new 被称为关键字。但是in c++new被称为运算符,为什么?

【问题讨论】:

标签: java c++


【解决方案1】:

new 是 C++ 中的关键字(参见 C++11 N3337 2.12/1 中的表)。然后它使用operator new 作为其实现,其副作用是允许程序员创建自己的重载operator new 以注入自定义内存管理。

【讨论】:

  • 第 2.11/1 条。 §2.12/1 将new 列为运算符。
  • 但 C++ 也允许重载基于符号的运算符。所以区别在于基于符号的运算符与基于名称的运算符。
  • @ChristianHackl, new 令人困惑,因为它是一个可重载的运算符,也是语言的一部分。要了解我的意思,请查看 en.cppreference.com/w/cpp/memory/new/operator_newen.cppreference.com/w/cpp/language/new
  • @chris:然而,我刚刚提到了正确的来源。至少在 N4296 草案中。数字变了吗?
  • @Christian Hackl 添加了对我引用的标准文档的引用。
【解决方案2】:

关键字是语法结构。它们是解析器固有识别的特定字符序列,不能用作标识符。 if 是一个关键字。 new 也是如此,即使在 C++ 中也是如此。

术语“运算符”用于识别用作表达式的一部分的事物。 + 是运算符;它作用于两个表达式并从它们创建一个值。 new 也是一个运算符;它接受参数和类型名+构造函数参数,并对它们执行各种操作,从而创建该类型的新对象。

if 不是运算符。哦,当然,if 语句涉及表达式,但 if 本身不是表达式的一部分。

【讨论】:

    【解决方案3】:

    您的具体示例有点误导。 new 在 C++ 和 Java 中都是关键字和运算符。这些术语也没有严格定义:它们是根据上下文定义的。

    keywords 是由编译器定义的出现在程序中的任何标记(尽管如果编译器允许,用户可以通过调整编译器来设置自定义关键字)。像 C/C++ 中的 typedef 这样的东西是关键字,根据语言的不同,基本类型也可以被视为关键字。关键字的常用符号是编译器不允许您在变量或函数之后命名变量或函数(尽管该规则有例外和警告)。

    operators 是对代码中的数据或对象执行的任何操作。最基本的是与基本数据类型相关的算术运算符,如+ - * / % = == || && 等。 new(以及,在 C++ 中,delete)也是运算符,因为它们对目标对象执行特定任务(特别是分配和删除堆内存)。 .(点)是一个运算符,C++ 中甚至有一些建议允许用户重载点运算符!

    不过,其中很多是没有区别的区别。知道newnew[] 做了什么比知道它们是否被严格归类为运算符(虽然很清楚,它们是),或者所有运算符是否都是关键字(我认为它们是,但我不确定)或者是否所有关键字都是运算符(我不相信它们是)。如果您发现这些区别很重要的案例研究,我很想知道它们。

    【讨论】:

    • 如果Java认为new是一个运算符,为什么table of operators中没有它?
    • @meriton Oracle,无论出于何种原因,似乎对“操作员”一词的定义比 C++ 更窄,因此将其排除在外。这是那些“番茄不是蔬菜”的论点之一,在严格的技术意义上,不,new 不是 Java 编程语言定义的运算符,但如果你到处说“new 是不是操作员”,实际上您传播的噪音多于信号。对于所有实际目的,new 是一个操作员,我对 Oracle 的建议是他们考虑修改该部分。
    【解决方案4】:

    在我的理解中关键字是语言的保留字,而操作符是“实现的语言功能”。

    碰巧有些关键字也是运算符

    instanceof 是另一个关键字示例,也是运算符。

    其他例子是算术运算符,+-*%也是运算符,但不是关键字

    我相信它适用于大多数语言,Java、C++ 和其他语言。

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2013-06-05
      • 2010-12-11
      相关资源
      最近更新 更多