在没有默认构造函数的情况下初始化对象数组
对象数组在编程中常用,但使用缺少默认构造函数的类初始化它们时可能会出现问题。考虑以下代码:
class Car { private: Car(){}; // Private default constructor int _no; public: Car(int no) { _no = no; } };
在此类中,默认构造函数 (Car()) 是私有的,这意味着在不提供参数的情况下无法创建 Car 类型的对象。但是,在初始化 Car 对象数组时,编译器尝试为每个元素调用默认构造函数,从而导致错误:
cartest.cpp:5: error: ‘Car::Car()’ is private cartest.cpp:21: error: within this context
使用 Placement-New
的解决方案为了解决这个问题,可以使用placement-new。 Placement-new 允许我们直接在该内存位置分配内存并构造对象,而无需调用对象的构造函数。下面是它的实现方式:
int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); // Allocate raw memory Car *ptr = static_cast<Car *>(raw_memory); // Cast to a pointer to Car for (int i = 0; i < NUM_CARS; ++i) { new(&ptr[i]) Car(i); // Call placement-new to construct Car objects in-place } }
通过使用placement-new,我们可以初始化对象数组,而无需显式调用默认构造函数。对象被创建并直接放入分配的内存中。
避免默认构造函数的优点
正如 Scott Meyers 的“更有效的 C ”第 4 条中提到的,避免无用的默认构造函数可以增强程序的正确性和可维护性。默认构造函数通常会导致类设计中的歧义,并使强制执行类不变量变得困难。通过显式定义构造函数,程序员断言只能使用特定的参数集创建该类的对象,从而确保更好的控制和清晰度。
以上是如何在没有默认构造函数的情况下初始化对象数组?的详细内容。更多信息请关注PHP中文网其他相关文章!