C++ 什么编译机制可以强制转换新运算符的结果?
显然,C++ 什么编译机制可以强制转换新运算符的结果?,c++,new-operator,C++,New Operator,显然,new操作符返回void*。所以我想知道在调用newa()创建类A的新实例时,什么机制允许void*强制转换到A* 举例说明: // Example program #include <iostream> #include <string> class A { public: A() {} }; void* createA() { return new A(); } int main() { A* a1 = new A();
new
操作符返回void*
。所以我想知道在调用newa()
创建类A
的新实例时,什么机制允许void*
强制转换到A*
举例说明:
// Example program
#include <iostream>
#include <string>
class A
{
public:
A() {}
};
void* createA()
{
return new A();
}
int main()
{
A* a1 = new A();
A* a2 = createA();
delete a1;
delete a2;
}
//示例程序
#包括
#包括
甲级
{
公众:
A(){}
};
void*createA()
{
返回新的A();
}
int main()
{
A*a1=新的A();
A*a2=createA();
删除a1;
删除a2;
}
A*a1=newa()
编译得很好(显然)
A*a2=createA()
未报告错误:错误:从“void*”到“A*”的转换无效
(显然也是…)
实际上,第一个函数还执行从void*
到a
的转换。什么机制或规则允许第一次转换而拒绝第二次转换
这可能是一个愚蠢的问题……如果是这样的话,很抱歉。这里有一个,它依次调用(随后是适当的转换)和构造函数
发件人:
尝试创建类型为的对象,由类型id类型表示
如果您手动调用运算符new
,则它将不起作用
A* a2 = operator new(sizeof(A));
也不会编译。这里没有强制转换
当编译器看到一个new
表达式时,它首先调用相应的new
运算符(取决于new
关键字的类型和参数)。返回指向原始内存块的指针;这种指针通常被键入void*
,因为它们不引用任何对象
然后执行相应的构造函数(取决于构造函数参数),从基类开始。执行构造函数的第一步是默认初始化要构造对象的原始内存。这包括初始化对象所需的任何内部元数据,如包含虚拟方法的vtable。完成后,内存区域包含一个新生对象,因此可以使用正确的类型创建此
。然后可以执行构造函数的其余部分(可以隐式或显式地使用this
)
一旦所有构造函数都被执行,
new
表达式的值就是this
的(键入的)值,那么:@JameyD:对,这里实际使用的不是操作符new
。在问问题之前寻找这个话题时,我错过了这个话题!你的意思是它是一个表达式
,编译器会无声地将其转换为对操作符的调用
+acast
?@jpo38很可能是的。这不仅仅是一个简单的呼叫操作员new
。明白了。这是有道理的,这个问题可能是詹姆斯的参考文献的重复D@jpo38哦,是的,这可能是个骗局。@jpo38-没有演员阵容。有一个转换。强制转换是您在源代码中编写的命令编译器进行转换的内容。这使它成为一个显式转换。编译器还可以执行隐式转换,即转换不由强制转换发出信号。
A* a2 = operator new(sizeof(A));