Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 良好的编程实践?_C++ - Fatal编程技术网

C++ 良好的编程实践?

C++ 良好的编程实践?,c++,C++,我想知道在使用良好的编程实践方面,做什么更好。我有一门课,会计。它有一个数据存储器,m_balance。我的问题是,在我的成员函数中,当我需要使用帐户余额进行比较时,我应该直接使用m_balance,还是使用成员函数Account::get_balance() 例如 int Account::get_balance() const { return m_balance; } void Account::debit( int money_value ) { if( money_v

我想知道在使用良好的编程实践方面,做什么更好。我有一门课,会计。它有一个数据存储器,m_balance。我的问题是,在我的成员函数中,当我需要使用帐户余额进行比较时,我应该直接使用m_balance,还是使用成员函数Account::get_balance()

例如

int Account::get_balance() const
{
    return m_balance;
}

void Account::debit( int money_value )
{
    if( money_value > 0 && money_value <= m_balance )
        m_balance -= money_value;
    else if( money_value == 0 )
        throw std::invalid_argument( "Invalid debit value" );
    else if( money_value > m_balance )
        throw std::invalid_argument( "Debit amount exceeds account balance" );
}
int账户::获取余额()常量
{
返回m_余额;
}
无效账户::借方(整数货币价值)
{
如果(货币价值>0和货币价值余额)
throw std::无效的_参数(“借方金额超过帐户余额”);
}
或者我应该定义成员函数

void Account::debit( int money_value )
{
    if( money_value > 0 && money_value <= get_balance() )
        m_balance -= money_value;
    else if( money_value == 0 )
        throw std::invalid_argument( "Invalid debit value" );
    else if( money_value > get_balance() )
        throw std::invalid_argument( "Debit amount exceeds account balance" );
}
void Account::debit(整数货币值)
{
如果(货币价值>0&&money价值获得余额())
throw std::无效的_参数(“借方金额超过帐户余额”);
}
一种做法比另一种好吗?调用函数需要更多的时间吗


如果这有道理的话。对不起,如果它让人困惑的话。我不知道如何解释它。

getBalance向程序保证,外部用户/调用者不能恶意使用m_balance的值(即更改它等)。“getter”的概念确保该数据成员的所有公共使用都是“获取”,而不是设置

“需要更多的时间吗?”
不以安全和良好规范为代价。早熟的优化是邪恶的。优化往往是由于需要而产生的。如果使用函数访问变量会降低代码的速度,那么可能还有其他方法可以降低运行时的复杂性。

如果将实现放在离散编译单元中,那么是的,访问该元素可能会有开销,因为程序可能必须执行跳转和返回。但是,编译器/链接器也可能在“链接时间优化”期间解决此问题

您还可以通过提供getter的内联实现来避免这种情况:

class Account {
    double m_balance;
public:
...
    double getBalance() const { return m_balance; }
...
};
这主要是关于良好的封装。当您进行草率的或部分的封装时,除了简单地访问其成员之外,用户还需要了解类的工作方式。例如,当您返回原始指针时通常会出现这种情况——最终用户现在负责知道是否、如何以及何时释放指针值


另外,getter是一种很好的证明未来的方法。也许将来您不会主动维护“m_平衡”,或者您需要添加一些线程保护以防止访问它。如果你的用户都直接访问m_balance,他们只会出现bug和奇怪的行为。如果他们已经在进行getBalance,则无需更改任何内容。

没问题!(如果没有其他我可以帮助的,请将问题标记为已回答。)是的,但该人正在内部使用m_balance。我认为在内部使用getter/setter是一个应该根据具体情况来决定的问题。我认为,当getBalance()表示未来的回报超过微不足道的时候,当它可能永远不会变为回报超过微不足道的时候,这是非常有帮助的。@请单击答案上下箭头下方的复选框(在0上方和下方),我在内部使用它。。。我在类定义的.CPP文件中谈到,在像C++这样的本地语言中,使用GETTER(I= GETCONTUTE())代替直接访问字段(I= MCOUNT)是常见的做法。这是一个极好的C++习惯,而且经常在其他面向对象语言中如C和java进行实践,因为编译器通常可以内嵌访问,如果需要限制或调试字段访问,则可以随时添加代码。然后编译器可以自由地内联它。在这一点上,它并不比直接访问更昂贵,但它的优点是,如果将来您需要让“getBalance”做一些更复杂的事情,您的用户已经在做正确的事情了。是的,它在类定义中。。。我就是这样写的,作为一个例子。。。它是一个成员函数