在以下代码中:
class A
{
A() {}
friend class B;
};
class B
{
public:
void foo() {A* p=new A;};
};
int main()
{
B b;
b.foo();
A* p = new A;
return 0;
}
函数foo()
通过编译,但行A* p = new A;
没有。怎么会这样? new
是一个全局运算符,因此无法调用私有构造函数,为什么编译器也不会抱怨foo()
?
答案 0 :(得分:3)
operator new函数不调用构造函数。它只是分配所需的存储空间。
之后,编译器魔术会调用构造函数,并且分别被foo
和main
认为。
答案 1 :(得分:2)
新表达式包括调用operator new
来分配内存(不调用构造函数,不需要访问)和对构造函数的调用。对构造函数的调用是在表达式的上下文中完成的,在这种情况下,B::foo
可以访问构造函数。
答案 2 :(得分:1)
new-expression有两件事:
operator new
的一些重载来获取一些内存; 构造发生在new-expression的上下文中,而不是对operator new
的调用。因此,构造函数必须在该上下文中可访问;因此,在您的示例中,可以在B::foo
中访问它,但不能在main
中访问。