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

C++ 覆盖数组元素时如何调用构造函数,c++,arrays,C++,Arrays,我想创建一个数组,其中每个元素可以从int或float设置(这些特定类型只是一个示例) 所以我继续和两个构造器一起上课: class ScaledNumber { private: int scaled_number; public: ScaledNumber(int number); ScaledNumber(float number); }; ScaledNumber::ScaledNumber(int number) { scaled_number

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

所以我继续和两个构造器一起上课:

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];
现在,如果我想重新分配例如
数字[3]
,我是否可以使用构造函数,还是必须添加
set()
方法或类似的方法

我是否可以使用构造函数

您可以简单地使用:

ScaledNumber numbers[5];
numbers[0] = 20;
numbers[1] = 30.2f;
编译器将在进行赋值之前使用适当的构造函数。最后两行由编译器翻译为:

numbers[0] = ScaledNumber(20);
numbers[1] = ScaledNumber(30.2f);
我是否可以使用构造函数

您可以简单地使用:

ScaledNumber numbers[5];
numbers[0] = 20;
numbers[1] = 30.2f;
编译器将在进行赋值之前使用适当的构造函数。最后两行由编译器翻译为:

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

ScaledNumber[5]的意义是什么无论如何?您以前不需要
ScaledNumber
让单个对象工作,可能是因为创建这样一个半就绪的对象没有意义,所以为什么五个对象都需要它

您只需初始化数组中的对象,如下所示:

#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 };
}

请注意,我还做了四项改进:我将
float
替换为
double
(语言的默认浮点类型),将C样式转换为
静态转换
,我向构造函数中添加了初始化列表,并让编译器对数组中的元素进行计数。

ScaledNumber[5]有什么意义无论如何?您以前不需要
ScaledNumber
让单个对象工作,可能是因为创建这样一个半就绪的对象没有意义,所以为什么五个对象都需要它

您只需初始化数组中的对象,如下所示:

#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 };
}

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

您通常会为此实现一个赋值运算符。您通常会为此实现一个赋值运算符。他需要一个默认构造函数才能工作,对吗?否则,原始数组声明将使用什么来构造所有5个元素?啊,所以desu ka(就是这样)谢谢,这解决了我的问题。出于好奇,(当构造函数接受多个参数时,这将如何工作?@AndreKR,在这种情况下,您可以使用
numbers[0]=ScaledNumber(arg1,arg2)。如果您能够使用C++11编译器,您可以将其缩短为
numbers[0]={arg1,arg2}。我要注意,它之所以有效,是因为c-TOR没有标记为
explicit
。他需要一个默认构造函数才能工作,对吗?否则,原始数组声明将使用什么来构造所有5个元素?啊,所以desu ka(就是这样)谢谢,这解决了我的问题。出于好奇,(当构造函数接受多个参数时,这将如何工作?@AndreKR,在这种情况下,您可以使用
numbers[0]=ScaledNumber(arg1,arg2)。如果您能够使用C++11编译器,您可以将其缩短为
numbers[0]={arg1,arg2}。我要注意,它之所以有效,是因为c-TOR没有标记为
explicit
。在我的库(我有数组的地方)中,我还不知道这些值。它们的主代码获取测量值并将它们传递给我的库,当所有5个值都到达时,库对它们执行计算。在我的库(我有数组)中,我还不知道这些值。它们主要代码获取测量值并将它们传递给我的库,当所有5个值都到达时,库对它们执行计算。