初始化使用 new 运算符分配的对象

可选的 initializer 字段包含在 new 运算符的语法中。 这样就可以使用用户定义的构造函数来初始化新对象。 有关如何执行初始化的详细信息,请参阅初始值设定项。 以下示例演示如何将初始化表达式与 new 运算符一起使用:

// expre_Initializing_Objects_Allocated_with_new.cpp
class Acct
{
public:
    // Define default constructor and a constructor that accepts
    //  an initial balance.
    Acct() { balance = 0.0; }
    Acct( double init_balance ) { balance = init_balance; }
private:
    double balance;
};

int main()
{
    Acct *CheckingAcct = new Acct;
    Acct *SavingsAcct = new Acct ( 34.98 );
    double *HowMuch = new double ( 43.0 );
    // ...
}

在此示例中,使用 new 运算符分配了 CheckingAcct 对象,但未指定默认初始化。 因此,调用了类的默认构造函数 Acct()。 然后,以相同的方式分配了对象 SavingsAcct,只不过将它显式初始化为 34.98。 由于 34.98 是类型 double,因此调用了采用该类型的参数的构造函数来处理初始化。 最后,将非类类型 HowMuch 初始化为 43.0。

如果对象是类类型,并且该类具有构造函数(如前面的示例所示),则仅当满足以下条件之一时,new 运算符才能初始化该对象:

  • 初始值设定项中提供的参数与构造函数的参数一致。

  • 该类有一个默认构造函数(可在没有参数的情况下调用的构造函数)。

访问控制和二义性控制根据多义性使用特殊成员函数的初始化中所述的规则对 operator new 和构造函数执行。

在使用 new 运算符分配数组时,无法对每个元素执行显式初始化;只调用了默认构造函数(如果有)。 有关详细信息,请参阅默认参数

如果内存分配失败(operator new 的返回值为 0),则不执行初始化。 这可防止尝试初始化不存在的数据。

与函数调用一样,未定义初始化表达式的计算顺序。 此外,您不应指望这些表达式能在执行内存分配前完全计算。 如果内存分配失败,并且 new 运算符返回零,则可能不会完全计算初始值设定项中的某些表达式。

请参见

参考

new 运算符 (C++)