Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么编译机制可以强制转换新运算符的结果?_C++_New Operator - Fatal编程技术网

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
。在问问题之前寻找这个话题时,我错过了这个话题!你的意思是它是一个
表达式
,编译器会无声地将其转换为对
操作符的调用
+a
cast
?@jpo38很可能是的。这不仅仅是一个简单的呼叫
操作员new
。明白了。这是有道理的,这个问题可能是詹姆斯的参考文献的重复D@jpo38哦,是的,这可能是个骗局。@jpo38-没有演员阵容。有一个转换。强制转换是您在源代码中编写的命令编译器进行转换的内容。这使它成为一个显式转换。编译器还可以执行隐式转换,即转换不由强制转换发出信号。
A* a2 = operator new(sizeof(A));