#include <iostream>
#include <cstdlib>
using namespace std;
class Box {
public:
Box() {
cout << "Constructor called!" <<endl;
}
void printer(int x)
{
cout<<x<<" printer"<<endl;
}
~Box() {
cout << "Destructor called!" <<endl;
}
};
int main( ) {
Box* myBoxArray = new Box[4];
Box* myBoxArray2 = (Box*)malloc(sizeof(Box[4]));
myBoxArray2->printer(23);
*myBoxArray2;
*(myBoxArray2).printer(23);
return 0;
}
问题只是因为当我使用新的&#39;打印出构造函数,但是当我简单地将指针解析为myBoxArray2
时,不会打印构造函数,也不打印函数printer
。
另外,为什么当我使用->
功能打印机运行时,而不是当我使用等效的*(myBoxArray2).printer(23)
时
答案 0 :(得分:2)
malloc
仅分配内存 ,它不会调用可能使对象处于不确定状态的构造函数。
在C ++中,您几乎永远不会使用malloc
,calloc
或free
。如果可能,请避免使用new
和new[]
,而是使用对象实例或实例向量。
至于你的第二个问题(与第一个问题无关),*(myBoxArray2).printer(23)
错误,因为.
选择运算符的precedence高于*
解除引用运算符.
。这意味着首先你在一个无效的指针上使用printer
成员选择器,并且你试图取消引用哪些(*myBoxArray2).printer(23)
返回哪个也是错误的,因为它没有返回任何内容。
您想要myBoxArray2->printer(23)
(请注意星号的位置 括号内),与<{1}}完全相同。< / p>
另请注意,myBoxArray2->printer(23)
与myBoxArray2[0].printer(23)
相同。
答案 1 :(得分:1)
不同之处在于malloc在没有初始化的情况下分配内存。另一方面,new
调用适当的构造函数来初始化该内存(如果该构造函数用于初始化该内存)并执行其他操作以使类可用。
同样delete
会为你调用析构函数。
malloc
与C ++一起使用,除非你知道自己在做什么。