Jer*_*fin 118
我通常会尝试用不同的方式来区分两者,以便更好地区分两者,但无论如何这都是一个很好的问题.
运算符new是一个分配原始内存的函数 - 至少在概念上,它没有太大的不同malloc().虽然这是相当不寻常的,除非你正在编写类似于你自己的容器,你可以直接调用operator new,例如:
char *x = static_cast<char *>(operator new(100));
Run Code Online (Sandbox Code Playgroud)
也可以在全局或特定类中重载operator new.IIRC,签名是:
void *operator new(size_t);
Run Code Online (Sandbox Code Playgroud)
当然,如果重载运算符new(全局或类),您还需要/也需要重载匹配的运算符delete.对于它的价值,还有一个单独的运算符new []用于为数组分配内存 - 但你几乎肯定最好完全忽略整个混乱.
新运算符是您通常用于从免费商店创建对象的运算符:
my_class *x = new my_class(0);
Run Code Online (Sandbox Code Playgroud)
两者之间的区别在于operator new 只分配原始内存,没有别的.new运算符首先使用operator new来分配内存,然后它调用正确类型对象的构造函数,因此结果是在该内存中创建的真实活动对象.如果该对象包含任何其他对象(嵌入式或基类),那么这些构造函数也会被调用.
Aus*_*yde 33
"运营商新"
class Foo
{
public:
void* operator new( size_t );
}
Run Code Online (Sandbox Code Playgroud)
"新运营商":
Foo* foo = new Foo();
Run Code Online (Sandbox Code Playgroud)
在这个例子中,new Foo()调用Foo::operator new()
换句话说,"new operator"调用" operator new()"就像+运算符调用一样operator +()
Nav*_*een 21
以下是来自Scott Meyers的更有效的C++书籍的引用:
new运算符调用函数来执行必需的内存分配,您可以重写或重载该函数以更改其行为.新操作员调用以分配内存的函数的名称是operator new.
AnT*_*AnT 10
"new operator"和"operator new"之间没有区别.两者都指向相同的东西:可重载/可替换的operator new函数,通常为新表达式创建的对象执行原始内存分配.
还需要注意的是既不术语存在于语言规范(其是正式术语的定义源极).
当您使用new在程序中创建一个对象,它被称为新的表达.New-expression由关键字new和语法定义的其他语法部分组成.此表达式语法的任何部分都不被称为"运算符".
原始内存分配功能operator new官方称为" operator new功能".请注意,单词operator和new此序列中只有两个单独的C++语言关键字.它们不构成英文术语"operator new".在语言规范中没有任何地方你会发现任何对"operator new"的引用作为英语术语.每次这只是两个独立关键字的组合,它们为内存分配函数生成声明语法.
同样,在简历中:正式在C++中,没有像"operator new"或"new operator"这样的英语术语.前一个序列在语言规范中仅作为关键词的组合出现,而不是英语术语.后者根本不存在.
OP的问题措词不正确。最好将其定为“'新运营商'与'新表达'之间的区别?” 注意“新的操作员”通常也指“新的操作员功能”。
周围有很多正确的答案,下面是我的:
1>'new expression'调用'operator new'分配原始内存,然后调用构造函数
apple * p = new apple(); //new expression
Run Code Online (Sandbox Code Playgroud)
2>'operator new'仅分配原始内存,与malloc差别不大
void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.
Run Code Online (Sandbox Code Playgroud)