首页 > 后端开发 > C++ > 如何在没有默认构造函数的情况下初始化对象数组?

如何在没有默认构造函数的情况下初始化对象数组?

Mary-Kate Olsen
发布: 2024-12-27 06:15:12
原创
785 人浏览过

How to Initialize Object Arrays Without a Default Constructor?

在没有默认构造函数的情况下初始化对象数组

对象数组在编程中常用,但使用缺少默认构造函数的类初始化它们时可能会出现问题。考虑以下代码:

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(&amp;ptr[i]) Car(i);  // Call placement-new to construct Car objects in-place
  }
}
登录后复制

通过使用placement-new,我们可以初始化对象数组,而无需显式调用默认构造函数。对象被创建并直接放入分配的内存中。

避免默认构造函数的优点

正如 Scott Meyers 的“更有效的 C ”第 4 条中提到的,避免无用的默认构造函数可以增强程序的正确性和可维护性。默认构造函数通常会导致类设计中的歧义,并使强制执行类不变量变得困难。通过显式定义构造函数,程序员断言只能使用特定的参数集创建该类的对象,从而确保更好的控制和清晰度。

以上是如何在没有默认构造函数的情况下初始化对象数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板