3

在以下代码中:

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()呢?

4

3 回答 3

3

operator new 函数不调用构造函数。它只是分配所需的存储空间。

构造函数随后由编译器魔术调用,并被认为分别由foomain完成。

于 2012-09-14T12:23:55.567 回答
2

新表达式包括对operator new分配内存的调用(不调用构造函数,不需要访问)和对构造函数的调用。对构造函数的调用是在表达式的上下文中完成的,在这种情况下 B::foo,它可以访问构造函数。

于 2012-09-14T12:26:12.477 回答
1

new-expression 做了两件事:

  • 调用一些重载operator new来获取一些内存;
  • 在该内存中构造一个对象。

构造发生在 new-expression 的上下文中,而不是调用operator new. 因此,构造函数必须在该上下文中是可访问的;所以在你的例子中,它可以在B::foo但不能在main.

于 2012-09-14T12:27:04.467 回答