c++ - 为参数化构造函数重载运算符 new[]

标签 c++

为什么 Person* p3 = new Person[5](7) 在下面的代码中失败了?如何使用 operator new[] 作为参数化构造函数?如果想用 new[] 调用参数化构造函数怎么办?

class Person
{
    public:

    int age; 

    Person(){}

    Person(int age):age(age){}

    void* operator new(size_t size) throw(bad_alloc)
    {
        cout<<"In overloaded new"<<endl;
        return (::operator new(size));
    }
    void operator delete(void* ptr) throw()
    {
        cout<<"in overloaded delete"<<endl;
        ::operator delete(ptr); 
    }

    void* operator new[](size_t size) throw(bad_alloc)
    {
        cout<<"operatoe new[]"<<endl;
        return (::operator new[](size));
    }
    void operator delete[](void* ptr) throw()
    {
        cout<<"delete[]"<<endl;
        ::operator delete[](ptr);
    }
};
int main()
{
   Person *p1 = new Person();  //// This is fine

   Person* p2 = new Person[5];  /// This is fine

   Person* p3 = new Person[5](7) /////Want to invoke parametrized constructor..

   delete p1;
   return 0;
}

最佳答案

new 表达式中的初始化程序必须与变量初始化的形式相同(参见 [expr.new])。这意味着对于数组,只允许三种形式:

T * p1 = new T[N];             // default-initialization
T * p2 = new T[N]();           // value-initialization
T * p3 = new T[N] { a, b, c }; // list-initialization

初始化器的含义与变量声明语句相同。

关于c++ - 为参数化构造函数重载运算符 new[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25928249/

相关文章:

c++ - 仅通过指针转换创建可互换的类类型,而无需分配任何新对象?

c++ - 将字符串 vector 转换为 int

c++ - 什么是抑制 MS 警告的最佳解决方案包括(mmsystem.h 中的 C4201)

c++ - std::chrono 的频率?

c++ - 无法用 C++ 将消息写入文件?

c++ - 超过时间限制如何提高速度

c++ - 固定动态大小的容器

c++ - 如何正确设置SonarQube cfamil.gcov?

c++ - 保证在处置类(class)时处置类(class)成员

c++ - 将 C++ 应用程序从 dll 打包到 exe