“新操作员”和“新操作员”之间有什么区别?
new
运算符。该运算符可以重载。为了区分默认运算符和重载版本,默认名称称为“新运算符”,而重载版本称为“新运算符”。
“新操作员”和“新操作员”之间有什么区别?
new
运算符。该运算符可以重载。为了区分默认运算符和重载版本,默认名称称为“新运算符”,而重载版本称为“新运算符”。
Answers:
我通常会尝试用不同的措词来区分两者,以便更好地区分两者,但这在任何情况下都是一个好问题。
new运算符是分配原始内存的函数-至少从概念上讲,它与并无太大区别malloc()
。除非您编写自己的容器之类的东西,否则这是很不常见的,但是您可以直接将operator称为new,例如:
char *x = static_cast<char *>(operator new(100));
也有可能在全局范围或特定类中重载new运算符。IIRC,签名是:
void *operator new(size_t);
当然,如果您重载了一个新的运算符(无论是全局的还是一个类),您也将希望/需要重载匹配的运算符删除。值得一提的是,还有一个单独的运算符new []用于为数组分配内存-但几乎可以肯定,最好完全忽略整个混乱情况。
new运算符通常是您从免费商店中创建对象所使用的运算符:
my_class *x = new my_class(0);
两者之间的区别在于new运算符仅分配原始内存,而没有其他分配。new运算符首先使用new运算符分配内存,然后为正确类型的对象调用构造函数,因此结果是在该内存中创建的真实活动对象。如果该对象包含任何其他对象(嵌入式对象或作为基类),则这些构造函数也将被调用。
operator delete(x);
。
“新操作员”
class Foo
{
public:
void* operator new( size_t );
}
“新操作员”:
Foo* foo = new Foo();
在这个例子中,new Foo()
调用Foo::operator new()
换句话说,“新运算符”调用“ operator new()
”,就像+运算符调用一样operator +()
new
不是C ++中的运算符。sizeof
,例如,是一个运算符,但new
并delete
不是。new
和delete
是关键字,以及这些关键字形成的语法结构称为new-expression和delete-expression。
sizeof
是语法结构,new
并且delete
都是有效的,合法的,可重载的运算符。从一切,我见过,new
而且delete
都是运营商。参见[cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
operator new
功能” 之类的术语。再次,sizeof
被explicilty称为“操作员”,而new
和delete
被从未被称为运营商。
以下是来自Scott Meyers的《更有效的C ++》一书的引文:
新操作员调用一个函数来执行必要的内存分配,并且您可以重写或重载该函数以更改其行为。新操作员调用以分配内存的函数的名称是new操作员。
“新操作员”和“新操作员”之间没有区别。两者都指的是同一件事:可重载/可替换operator new
函数,通常为new-expressions创建的对象执行原始内存分配。
还要注意的是既不语言规范存在术语(这是官方术语的定义来源)。
new
在程序中使用它创建对象时,它称为new-expression。New-expression由关键字组成new
和语法定义的其他语法部分组成。此表达式语法的任何部分都不会被称为“运算符”。
原始内存分配功能operator new
正式称为“ operator new
功能”。请注意,单词operator
和new
按此顺序只是两个单独的C ++语言关键字。他们没有形成英文术语“ operator new”。在语言规范中,找不到任何将“ operator new”作为英语术语的引用。每次这只是两个独立关键字的组合,它们为内存分配函数产生声明语法。
同样,在履历表中:在C ++中没有正式的英语术语,如“新操作员”或“新操作员”。在语言规范中,前一个序列仅作为关键字的组合而不是英语术语出现。后者根本不存在。
OP的问题措词不正确。最好将其定为“'新运营商'与'新表达'之间的区别?” 注意“新的操作员”通常也指“新的操作员功能”。
周围有很多正确的答案,下面是我的:
1>'new expression'调用'operator new'分配原始内存,然后调用构造函数
apple * p = new apple(); //new expression
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.
new运算符:C ++支持使用new运算符动态分配对象。新操作员从称为免费存储的池中为对象分配内存。新运算符将特殊功能运算符称为new。
operator new:如果请求的存储空间为零字节,则operator new返回指向不同对象的指针(即,重复调用operator new将返回不同的指针)。如果分配请求的内存不足,则new操作符将返回NULL或引发异常。运算符new的第一个参数必须为size_t类型(在STDDEF.H中定义的类型),并且返回类型始终为void *。
这是MSDN链接,以获取更多详细信息:
new是运算符和关键字。
请参阅[1]在2.13和&在2.12中。
new做两件事:T * t = new T(arg);
1)为对象分配内存:void * ptr = 运算符new(sizeof(T));
// 运算符new是一个函数(就像c中的malloc一样),而不是运算符。(请参见3.7.4中的[1])。但是条款7 [2]表示它也是一个运算符。在我看来,运算符和函数之间的差异很小,当您回想起重载运算符是由函数实现时,您可以看到它。
//我们可以重载此操作符/函数(新的操作符),以执行我们想要的操作。
2)在分配的内存中初始化对象:在ptr上调用T :: T(arg)
// 只有编译器才能执行此操作。我和你都不能。
//如果T有成员,则编译器还将调用成员对象的构造函数和基类的构造函数。而且此调用是递归的。只有编译器可以做到这一点。
因此,new操作员会执行new任务的一部分,只有在这一部分中我们才能做些事情。
[1]:ISO / IEC,N3690。http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
[2]:Meyers,Scott。有效的C ++,第3版。