C++创建对象数组时能否同步调用构造函数完成初始化
问题解答
你完全可以在声明对象数组的同时完成构造初始化,你写的User user1[1]("Bebek");属于语法错误,C++标准不支持这种写法,需要改用聚合初始化列表的语法实现需求。
正确实现方式
1. 普通栈数组初始化
如果确实需要先声明普通数组再往vector里塞元素,正确写法如下:
// 写法1:显式调用构造函数 User user1[1] = { User("Bebek") }; // C++11及以上版本支持简化写法,可省略显式类名和等号 User user1[1] { "Bebek" };
如果是多元素数组,直接在初始化列表里按顺序传入每个元素的构造参数即可:
// 初始化3个元素的User数组 User users[3] = { User("张三"), User("李四"), User("王五") };
2. 更高效的vector直接初始化方案
你完全不需要额外声明普通数组做中转,vector自身支持直接构造元素,效率更高、代码更简洁:
- 逐个插入元素可以用
emplace_back,直接在vector的内存空间中构造对象,省去临时对象的拷贝开销:
std::vector<User> vuser; // 直接传入构造参数即可,不需要先构造临时User对象 vuser.emplace_back("Bebek"); vuser.emplace_back("Meilianto");
- 一次性批量初始化多个元素可以直接用初始化列表:
// 直接初始化包含3个元素的vector std::vector<User> vuser = { User("甲"), User("乙"), User("丙") }; // C++11及以上简化写法 std::vector<User> vuser { "甲", "乙", "丙" };
修正后的完整可运行代码
#include <iostream> #include <vector> #include <string> class User{ std::string name; public: User() = default; User(std::string name): name(std::move(name)) {} void set_name(std::string name){ this->name = std::move(name); } std::string get_name() const { return name; } }; int main(){ // 数组直接初始化示例 User user1[1] { "Bebek" }; std::cout << "user1[0]: " << user1[0].get_name() << std::endl; std::vector<User> vuser; // 直接把初始化好的数组元素加入vector vuser.push_back(user1[0]); std::cout << "vuser[0]: " << vuser[0].get_name() << std::endl; // 无需中转数组,直接构造元素加入vector vuser.emplace_back("Meilianto"); std::cout << "vuser[1]: " << vuser[1].get_name() << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Meilianto Luffenz
相关产品推荐
相关产品推荐

