1

我有一个类存储对某种应用程序状态的引用,然后在操作期间它会发生变化:

class Mutator {
    private:
        State& _state;

    public:
        Mutator(State& state);
        ...
};

Mutator::Mutator(State& state) : _state(state) {

}
...

通常我会创建并传递state这样的:

State state;
Mutator mutator(state);

如果我像这样初始化 Mutator,我的 Mutator 类中的状态引用会发生什么:

Mutator mutator(State());

我假设,由于状态引用是临时的,Mutator._state成员将指向一个内存位置,该位置可能包含也可能不包含导致不可预测行为的状态值。它是否正确?

4

1 回答 1

0

如果使用引用,则需要在构造函数中初始化变量(因为不是 NULL)。这更安全,因为您确信引用确实指向现有对象。

关于

Mutator mutator(State());

这没有多大意义,除非 State 对象仅用作 Mutator 构造函数的输入;但是,如果它更改了新创建的 State 变量,则当构造函数返回并创建 mutator 时,State() 实例将被删除。

此外(请参阅下面的 NathanOliver 注释),它不是合法的 C++ 代码且不可移植。

更新

测试应用:

class State {
    public: State() {}
};

class Mutator {
    private:  State& _state;
    public:   Mutator(State& state) : _state(state)  { }
};

void setup() {
    Mutator mutator(State());
}

int main() {
    return 0;
}

上面的代码编译器和 Arduino 编译器(1.8.9)上的链接正确:

Sketch uses 260 bytes (0%) of program storage space. Maximum is 253952 bytes.
Global variables use 0 bytes (0%) of dynamic memory, leaving 8192 bytes for local variables. Maximum is 8192 bytes.
于 2019-09-24T08:57:55.757 回答