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

问题描述 投票:1回答:1

我对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设置为零。

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

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

enter image description here

如何让new操作符调用我写的构造函数?

c++ class new-operator
1个回答
3
投票

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

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

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

#include <memory>

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

要么

auto m = std::make_shared<MovingAverage>(3);
© www.soinside.com 2019 - 2024. All rights reserved.