为什么'new'是一个运算符,而不是一个函数?

时间:2010-12-20 10:44:15

标签: c++ new-operator

是否有任何问题,例如编译时运算符,sizeof与new相关联?

2 个答案:

答案 0 :(得分:5)

new是一个操作符,因此您可以为某些(或所有)类添加overload

编辑:我会尽力澄清以下@ sbi的评论。

考虑两个类:

class Base
{
}

class Derived : public Base
{
}

我们假设new()是一个函数,我们希望将它专门用于Base类及其后代。我们将拥有“基本”new()功能:

void *new(size_t size);

重载函数不能仅因返回类型而有所不同,因此我们无法做到:

Base *new(size_t size);  // Illegal.

我们不能使用成员函数,因为它们需要调用现有实例。我们可以使用静态成员函数:

class Base
{
    static Base *new();
}

但是在分配Derived的实例时产生的语法会非常尴尬:

Derived *derived = Base::new();  // Uh?

答案 1 :(得分:3)

我认为对您的问题的简短回答是新运算符不是函数,因为它是 new-expression 中出现的new,而 new-expression 不遵循函数调用语法。当 new-expression 的可能组件/操作数之一是 type-id 时,它如何成为一个函数?你能定义一个 new-expression 的语法,使new成为一个函数,大概是在被分配的类型上重载了吗?如果可以的话,Bjarne Stroustrup会不会优先考虑他实际发明的语法,以及ISO标准化?

说实话,我认为在日常英语中,标准正在推动其运气将 new-expression 分类为“一元表达”。如果是,那么它的“单个”操作数最多由三个独立的部分组成( new-placement new-type-id new-initializer )。并不是真的很重要 - 它就是这样,而AFAIK标准没有定义任何适用于所有运算符的属性,因此无论你将其称为运算符还是仅仅是用于引入的关键字都无关紧要一个 new-expression