如果我传递临时引用并将其存储为 class 成员会怎样?
What happens if I pass a temporary reference and store it as a class member?
我有一个 class 存储对某种应用程序状态的引用,然后它在操作期间发生变异:
class Mutator {
private:
State& _state;
public:
Mutator(State& state);
...
};
Mutator::Mutator(State& state) : _state(state) {
}
...
通常我会像这样创建并传递 state
:
State state;
Mutator mutator(state);
如果我像这样初始化 Mutator,我的 Mutator class 中的状态引用会发生什么:
Mutator mutator(State());
我假设,由于状态引用是临时的,Mutator._state
成员将指向一个内存位置,该位置可能包含也可能不包含导致不可预测行为的状态值。这是正确的吗?
如果使用引用,则需要在构造函数中初始化变量(不为NULL)。这样更安全,因为您确信引用确实指向现有对象。
关于
Mutator mutator(State());
这没有多大意义,除非 State 对象仅用作 Mutator 构造函数的输入;但是,如果它更改新创建的 State 变量,则在创建构造函数 returns 和 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.
我有一个 class 存储对某种应用程序状态的引用,然后它在操作期间发生变异:
class Mutator {
private:
State& _state;
public:
Mutator(State& state);
...
};
Mutator::Mutator(State& state) : _state(state) {
}
...
通常我会像这样创建并传递 state
:
State state;
Mutator mutator(state);
如果我像这样初始化 Mutator,我的 Mutator class 中的状态引用会发生什么:
Mutator mutator(State());
我假设,由于状态引用是临时的,Mutator._state
成员将指向一个内存位置,该位置可能包含也可能不包含导致不可预测行为的状态值。这是正确的吗?
如果使用引用,则需要在构造函数中初始化变量(不为NULL)。这样更安全,因为您确信引用确实指向现有对象。
关于
Mutator mutator(State());
这没有多大意义,除非 State 对象仅用作 Mutator 构造函数的输入;但是,如果它更改新创建的 State 变量,则在创建构造函数 returns 和 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.