C++ 如果构造函数中的其他实例化失败,构造是否会失败

C++ 如果构造函数中的其他实例化失败,构造是否会失败,c++,constructor,C++,Constructor,我有一个这样的构造函数 ClassA::ClassA(void) { pImplClassA = new (std::nothrow) pImplClassA(); if (pImplClassA == null) { return; } } ClassA::SomeFunc() { pImplClassA->SomeFunc(); } 我的问题是,如果p

我有一个这样的构造函数

    ClassA::ClassA(void)
    {
       pImplClassA = new (std::nothrow) pImplClassA();
       if (pImplClassA == null)
       {
         return;
       }
    }
    ClassA::SomeFunc()
    {
      pImplClassA->SomeFunc();
    }
我的问题是,如果pClassB失败,classA实例是否也将为null,或者在我完成此操作时它将已经实例化

  ClassA* pClassA = new ClassA()
    pClassA->SomeFunc();
pClassA不应该为null,因为构造函数已失败。如果没有,我仍然能够调用ClassA::SomeFunc(),它将在那里崩溃,因为它没有实例化

pClassA是否为空?

谢谢你说的失败是什么意思?如果
ClassB
的构造函数抛出异常,因为在
ClassA
的构造函数中没有捕捉到它,就好像
ClassA
的构造函数会抛出异常一样,所以不,对象不会被创建,也就不会有
pClassA
可以说了。

失败是什么意思?如果<代码> ClassB < /C>的构造函数抛出异常,因为您在代码< ClassA > /Cuth>的构造函数中没有捕获它,就好像<代码> ClassA < /C>的构造函数会抛出异常,所以不,对象不会被创建,也不会有<代码> pCasa< /Co> >。< /P>为什么不测试它自己看?C++中没有“实例为空”这样的概念。“pClassB”也不能失败;它只是一个指针。这个问题毫无意义。每当我有类似你的问题,我就去某个地方,然后检查发生了什么。@ LoKi2302:在每个角落都隐藏着不明确的行为,这在C++中不是一个非常有用的策略。@ LoKi2302:你问我什么是不确定的行为吗?第二,他没有说“扔”,因为他显然不是指“扔”。事实上,他特别要求它不要与std::nothrow一起抛出。如果他在第一本C++书上,那就是他不应该仅仅依靠编译程序和检查输出来回答他的行为问题。为什么不测试它自己看呢?在C++中,没有一个“实例为null”的概念。“pClassB”也不能失败;它只是一个指针。这个问题毫无意义。每当我有类似你的问题,我就去某个地方,然后检查发生了什么。@ LoKi2302:在每个角落都隐藏着不明确的行为,这在C++中不是一个非常有用的策略。@ LoKi2302:你问我什么是不确定的行为吗?第二,他没有说“扔”,因为他显然不是指“扔”。事实上,他特别要求它不要与std::nothrow一起抛出。如果他在第一本C++书上,那就是他不应该仅仅依靠编译程序和检查输出来回答他关于行为的问题。我已经更新了这个问题。我正在为pClassB处理null。现在会发生什么?@V.KSingh如果在构造函数中处理异常,将创建该对象。当然
pClassA
将不为null,它将指向有效对象。但是如果pClassA不为null,那么此构造函数的用途是什么。我的意思是假设我有一些pImpl实例化(例如,pClassB就是pImpl)。如果pClassA是有效的,那么它不是违背了构造函数的目的吗。我的意思是,如果pClass A是有效的,有什么用,我将无法使用此pImpl。@V.KSingh当然没有用,这就是为什么您没有捕获异常的原因。:)我已经更新了问题。我正在为pClassB处理null。现在会发生什么?@V.KSingh如果在构造函数中处理异常,将创建该对象。当然
pClassA
将不为null,它将指向有效对象。但是如果pClassA不为null,那么此构造函数的用途是什么。我的意思是假设我有一些pImpl实例化(例如,pClassB就是pImpl)。如果pClassA是有效的,那么它不是违背了构造函数的目的吗。我的意思是,如果pClass A是有效的,有什么用,我将无法使用此pImpl。@V.KSingh当然没有用,这就是为什么您没有捕获异常的原因。:)