“ new”不会在类中调用指定的构造函数吗?

时间:2018-09-03 22:23:59

标签: c++ class new-operator

我对new运算符的理解肯定存在一些缺陷。

这是代码的相关部分:

#include <queue>

using namespace std;

class MovingAverage {
public:
    /** Initialize your data structure here. */
    MovingAverage(int size) {
        queue<double> q;
        int max_size = size;
        int curr_size = 0;
        double sum = 0.0;
    }

private:
    queue<double> q;
    int curr_size;
    int max_size;
    double sum;
};

int main(){
    MovingAverage * m = new MovingAverage(3);  // This line does not work as expected!
    return 0;
}

在上面的代码中,类MovingAverage具有一个构造函数MovingAverage(int size),该构造函数将其两个成员变量curr_sizesum设置为零。

但是,主函数中的行MovingAverage * m = new MovingAverage(3);不会返回指向两个成员curr_sizesum为零的类实例的指针。

相反,调试器显示创建的对象具有curr_size = 1953853300max_size = 6647401

enter image description here

如何让new运算符调用我编写的构造函数?

1 个答案:

答案 0 :(得分:3)

您的代码在构造函数的主体内部声明了局部变量。正确的方法是使用构造函数的member initializer list

awk '
    NF { 
          trailing = (/ / ? "#" : "")
          out=$0".txt"
          printf("# %s\n#elements/%s%s\n", $0, $0, trailing) > out
          close(out)
       }
    ' list_of_names.txt

除此之外,理想情况下,您不应该使用这样的原始指针。有std::unique_ptrstd::shared_ptr之类的智能指针类,可以使代码更安全,更易于维护。因此您的代码可能是:

MovingAverage(int size):
    max_size(size),
    curr_size(0),
    sum(0.0)
{}

#include <memory>

...
auto m = std::make_unique<MovingAverage>(3);