在 setter 函数内调用 getter 与直接访问数据成员
Calling getters inside a setter function vs direct access to data members
问题很简单:访问对象的成员变量是否不需要在setter中调用getter?假设所有的getter都是inline
d和return const
成员的引用。
举个例子:
class Foo
{
public:
inline const std::uint32_t& getValue( ) const noexcept
{
return m_value;
}
inline const std::uint32_t& getBar( ) const noexcept
{
return m_bar;
}
void setValue( const std::uint32_t value )
{
m_value = value * getBar() * 3; // vs m_value = value * m_bar * 3;
}
private:
std::uint32_t m_value;
std::uint32_t m_bar;
};
哪个更地道?我认为编译器生成的代码应该没有区别。但就可读性而言,它们有点不同。使用 getter 而不是直接输入的好处是什么? m_bar
?
class 中的代码始终具有对内部数据成员(以及成员函数)的完全访问权限。所以没有必要。我对你是否应该这样做的看法
- 如果 getter 尤其是 setter 有副作用(假设您计算某个特定值被更改或验证一个值的次数),那么您应该调用它们
- 编译发布时的开销将消失,因为编译器可以看到您只是在读取或写入值(如果它们是简单的读写 get/set)
- 你可能会养成总是打电话给他们的习惯,以防你以后希望他们有副作用
注意我没有说什么 'best',只是要考虑的事情
问题很简单:访问对象的成员变量是否不需要在setter中调用getter?假设所有的getter都是inline
d和return const
成员的引用。
举个例子:
class Foo
{
public:
inline const std::uint32_t& getValue( ) const noexcept
{
return m_value;
}
inline const std::uint32_t& getBar( ) const noexcept
{
return m_bar;
}
void setValue( const std::uint32_t value )
{
m_value = value * getBar() * 3; // vs m_value = value * m_bar * 3;
}
private:
std::uint32_t m_value;
std::uint32_t m_bar;
};
哪个更地道?我认为编译器生成的代码应该没有区别。但就可读性而言,它们有点不同。使用 getter 而不是直接输入的好处是什么? m_bar
?
class 中的代码始终具有对内部数据成员(以及成员函数)的完全访问权限。所以没有必要。我对你是否应该这样做的看法
- 如果 getter 尤其是 setter 有副作用(假设您计算某个特定值被更改或验证一个值的次数),那么您应该调用它们
- 编译发布时的开销将消失,因为编译器可以看到您只是在读取或写入值(如果它们是简单的读写 get/set)
- 你可能会养成总是打电话给他们的习惯,以防你以后希望他们有副作用
注意我没有说什么 'best',只是要考虑的事情