You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用带参非默认构造函数构造C++类对象数组?

这个问题我之前也碰到过!因为你用new hi[number_of_instance]的时候,编译器会尝试调用hi的默认构造函数,但你的类只定义了带两个int参数的构造函数,所以肯定会编译失败。下面给你几种可行的解决办法:

方法1:C++11及以后用初始化列表(固定数量场景)

如果你的实例数量是固定的编译期常量,或者能提前知道每个实例的参数,可以直接用初始化列表初始化数组:

class hi { 
public: 
    hi(int a, int b){}; 
}; 

int main() { 
    hi *hello = new hi[3]{{1, 2}, {3, 4}, {5, 6}}; 
    // 记得用完后释放内存
    delete[] hello;
}

不过要注意,这种方式不适用于number_of_instance是运行时变量的情况,因为初始化列表的长度必须是编译期确定的。

方法2:用std::vector(推荐,支持动态数量)

这是更灵活也更安全的方案,std::vector可以轻松处理动态数量的对象,并且直接调用你的自定义构造函数:

#include <vector>

class hi { 
public: 
    hi(int a, int b){}; 
}; 

int main() { 
    int number_of_instance = 5; 
    std::vector<hi> hello;
    hello.reserve(number_of_instance); // 提前分配内存,提升效率

    // 循环创建对象,这里用i和i+1做示例,你可以换成实际需要的参数
    for(int i = 0; i < number_of_instance; ++i) {
        hello.emplace_back(i, i+1);
    }

    // vector会自动管理内存,不需要手动delete
}

emplace_back会直接在vector的内存空间里构造hi对象,完美适配你的双参数构造函数,而且不需要手动管理内存,非常省心。

方法3:C++11之前的手动内存管理(仅作兼容参考)

如果你的项目必须兼容C++11之前的标准,可以先分配原始内存,再用placement new逐个构造对象,最后还要手动析构每个对象并释放内存:

#include <cstdlib>

class hi { 
public: 
    hi(int a, int b){}; 
    ~hi(){}; // 确保类有析构函数
}; 

int main() { 
    int number_of_instance = 5; 
    // 先分配足够的原始内存
    hi* hello = static_cast<hi*>(malloc(sizeof(hi) * number_of_instance));

    // 逐个调用构造函数创建对象
    for(int i = 0; i < number_of_instance; ++i) {
        new(&hello[i]) hi(i, i+1); // placement new 直接在已分配内存中构造对象
    }

    // 使用对象...

    // 必须逐个手动析构对象
    for(int i = 0; i < number_of_instance; ++i) {
        hello[i].~hi();
    }

    // 释放原始内存
    free(hello);
}

这种方式需要手动处理构造、析构和内存释放,很容易出错,所以除非万不得已,优先用std::vector方案。

内容的提问来源于stack exchange,提问作者Zeeshan Hayat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:00:00