C++ 为什么';即使malloc需要,new是否也需要对指针进行强制转换?

C++ 为什么';即使malloc需要,new是否也需要对指针进行强制转换?,c++,malloc,new-operator,C++,Malloc,New Operator,标题中“新建”的定义为: void* operator new(size_t); malloc的定义如下所述: void* malloc(size_t); 现在,由于C++是一种强类型语言,它需要程序员从一个转换中转换一个VULL *指针到程序员需要的类型…在malloc中,我们必须执行强制转换,但不能在new中执行,尽管两者都返回void*指针。为什么?因为当您使用new时,您(通常)使用一个“新表达式”,它分配并初始化一个对象。然后将该对象的地址分配给指向相同(或父)类型的对象的指针

标题中“新建”的定义为:

 void* operator new(size_t);
malloc的定义如下所述:

 void* malloc(size_t);

现在,由于C++是一种强类型语言,它需要程序员从一个转换中转换一个VULL *指针到程序员需要的类型…在malloc中,我们必须执行强制转换,但不能在new中执行,尽管两者都返回void*指针。为什么?

因为当您使用
new
时,您(通常)使用一个“新表达式”,它分配并初始化一个对象。然后将该对象的地址分配给指向相同(或父)类型的对象的指针,该对象不需要强制转换。一个普通的新表达式(即不是新的位置)将在内部调用
运算符new
,但新表达式的结果不仅仅是
运算符new
的结果


如果直接调用
运算符new
,则需要强制转换其结果以将返回值分配给非空指针,就像处理
malloc
的返回一样,因为您对如何使用
malloc
有错误的印象。它不接收类型作为参数,只接收类型的大小

< P> C和C++是不同的语言。在C语言中,您不需要将
malloc
void*
强制转换为目标指针类型。在C++中,<代码>新< /COD>运算符被深入构建到语言中,这样它总是返回与您在参数中给出的类型相对应的值。
<>规则非常简单,使用C++ <代码> < <代码> > C >代码> MalOC/ >,不要混合它们。 因为调用
new
时,操作符new调用只是整个链中生成的一个步骤

当您执行
s=新建my_类型(args)时,编译器将其扩展为:

s = (my_type*)my_type.operator new(sizeof(my_type));
s.my_type(args); //Constructor call

也请检查这一点也请检查:@Rohit链接的问题的公认的[和出色的:-)]答案更详细地说明了这一点。new如何接收作为参数的类型???@bhuwanshani,
new
是一个运算符而不是一个函数。在您使用它的地方,您总是为它指定要分配和构造的对象的类型。由编译器创建链接。在C语言中,对于调用
malloc
您只给出大小。@bhuwanshani,因为它不是必需的。要编写通用的
运算符new
您需要的目标类型的唯一属性是大小。编译器通过调用类型的相应构造函数来确保类型特定的内容。@Bhuwanshani:您混淆了新运算符和新运算符。它们是两种不同的东西。新运算符是用于分配和构造对象的语法。运算符new是一种特殊的声明语法,用于声明和写入实现内存分配的函数,并连接到新运算符。newint(3)知道int的大小,与sizeof(int)知道的方式相同:它们是使用类型进行操作的运算符。新操作符计算大小并将其传递给相应的操作符new函数。