覆盖数组元素时如何调用构造函数

How to call constructor when overwriting array elements

本文关键字:调用 构造函数 何调用 数组元素 覆盖      更新时间:2023-10-16

我想创建一个数组,其中每个元素都可以从intfloat设置(这些特定类型只是一个示例)。

所以我继续与两个构造师一起上课:

class ScaledNumber {
  private:
    int scaled_number;
  public:
    ScaledNumber(int number);
    ScaledNumber(float number);
};
ScaledNumber::ScaledNumber(int number) {
  scaled_number = number * 1000;
}
ScaledNumber::ScaledNumber(float number) {
  scaled_number = (int)(number * 1000);
}

当我使用该类的单个变量时,这可以正常工作。但是现在我想创建一系列此类对象。我必须添加第三个构造函数才能使声明工作:

ScaledNumber::ScaledNumber() {}
ScaledNumber numbers[5];

现在,如果我想重新分配例如numbers[3],我可以以某种方式使用构造函数,还是必须添加set()方法或类似方法?

我可以以某种方式使用构造函数

您可以简单地使用:

ScaledNumber numbers[5];
numbers[0] = 20;
numbers[1] = 30.2f;

编译器将在进行分配之前使用适当的构造函数。最后两行由编译器翻译为:

numbers[0] = ScaledNumber(20);
numbers[1] = ScaledNumber(30.2f);

ScaledNumber numbers[5];的意义是什么?您以前不需要ScaledNumber number;才能使用一个对象,这大概是因为创建这样的半就想对象没有意义,那么为什么您需要五个对象?

您只能初始化阵列中的对象:

#include <iostream>
class ScaledNumber {
  private:
    int scaled_number;
  public:
    ScaledNumber(int number);
    ScaledNumber(double number);
};
ScaledNumber::ScaledNumber(int number) : scaled_number(number * 1000) {
    std::cout << "intn";
}
ScaledNumber::ScaledNumber(double number) : scaled_number(static_cast<int>(number * 1000)) {
    std::cout << "doublen";
}
int main() {
    ScaledNumber numbers[] = { 1, 2.2, 3, 4.4, 5 };
}

输出:

int
double
int
double
int

请注意,我还做出了四个改进:我用float替换CC_7(语言的默认浮点类型),将C-Style铸造变成static_cast,我将初始化列表添加到了构造函数,然后我做了编译器计数数组中的元素。