如何在数组中使用类构造函数?构造传参及调用问题咨询
关于C++构造函数的几个问题解答
嘿,我来一步步帮你理清这些构造函数相关的问题~
1. 构造函数传递参数当然可行!
这是C++中初始化类对象、给成员变量赋初始值的核心方式之一,完全没问题,只要你在类中定义了对应的带参构造函数就行。
2. 为什么会提示“重复声明”?
你写的代码:
flight *flight = new flight[random];
这里犯了一个命名冲突的错误——变量名flight和你的类名flight重名了!编译器会把后面的flight当成变量,而不是类,所以当你后续尝试调用构造函数时,就会被判定为重复声明。
解决方法很简单:把变量名改成别的,比如flights:
flight *flights = new flight[random];
3. 用new[]创建数组时,构造函数怎么调用?
当你用new[]创建对象数组时,默认会给每个元素调用无参构造函数。如果你的flight类没有定义无参构造(编译器也没生成默认的),代码会直接报错。
如果想给数组里的每个对象用带参构造函数初始化,分两种情况:
情况一:C++98及更早版本
需要手动分配原始内存,再用placement new调用构造函数(这种方式要手动管理析构和内存释放):
// 1. 分配足够的内存,不调用构造函数 void* raw_mem = operator new[](random * sizeof(flight)); // 2. 强制转换为flight指针 flight* flights = static_cast<flight*>(raw_mem); // 3. 逐个调用带参构造函数初始化 for (int i = 0; i < random; ++i) { new (&flights[i]) flight(5); // 这里的5就是你要传递的参数 } // 注意:销毁时要手动调用析构函数,再释放内存 for (int i = 0; i < random; ++i) { flights[i].~flight(); } operator delete[](raw_mem);
情况二:C++11及以后版本
更推荐用std::vector替代原生数组,它支持直接用带参构造初始化元素,而且不用手动管理内存:
#include <vector> // 方式1:直接创建包含random个flight(5)的vector std::vector<flight> flights(random, flight(5)); // 方式2:用emplace_back直接在vector中构造对象(避免拷贝) std::vector<flight> flights; flights.reserve(random); // 提前分配内存,提升效率 for (int i = 0; i < random; ++i) { flights.emplace_back(5); // 直接调用带参构造创建对象 }
4. 先声明无参对象,再用fl(5)重新构造?不行!
当你写flight fl;时,fl已经通过无参构造函数完成了初始化。后续的fl(5);会被编译器解析成函数调用(试图调用一个返回值为flight、参数为int的函数),而不是重新构造对象,这肯定会报错。
如果想重新初始化对象,有两种可选方式:
- 方式1:使用赋值运算符(前提是你的类支持赋值,要么编译器生成了默认赋值运算符,要么你自己重载了):
flight fl; fl = flight(5); // 创建临时对象,赋值给fl
- 方式2:用placement new手动重构(谨慎使用,容易出错):
flight fl; fl.~flight(); // 先手动销毁已有对象 new (&fl) flight(5); // 在fl的内存空间上重新调用带参构造
不过一般来说,直接创建新对象flight fl(5);会更简单安全。
内容的提问来源于stack exchange,提问作者Emre Yavuzalp
相关产品推荐
相关产品推荐

