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

时间:2017-12-14 16:28:09

标签: c++ arrays

我想创建一个数组,其中每个元素都可以从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()方法或类似的东西?

2 个答案:

答案 0 :(得分:2)

  

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

您可以简单地使用:

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

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

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

答案 1 :(得分:0)

无论如何,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 << "int\n";
}

ScaledNumber::ScaledNumber(double number) : scaled_number(static_cast<int>(number * 1000)) {
    std::cout << "double\n";
}

int main() {
    ScaledNumber numbers[] = { 1, 2.2, 3, 4.4, 5 };
}

输出:

int
double
int
double
int

请注意,我还做了四项改进:我将float替换为double(语言的默认浮点类型),将C风格转换为static_cast,I将初始化列表添加到构造函数中,并使编译器计算数组中的元素。