使非成员函数不变

时间:2013-07-16 18:29:26

标签: c++ constants

我要求将非成员函数设为常量,即我希望强制它不允许对全局变量进行任何修改。

我知道非会员功能是不可能的,但是想知道是否有解决方法。

我想到的一种方法是为此声明一个带有常量成员函数的单独类,并访问const全局变量。但不幸的是,它允许在常量成员函数中访问和修改非常量全局变量(为什么??)。

4 个答案:

答案 0 :(得分:6)

const的成员函数上的T - 限定符并不意味着该函数没有副作用:它表示函数的隐式this参数具有类型{ {1}}。换句话说,该函数不能修改非静态数据成员(好吧,不管怎么说都不容易)。

没有标准的方法来强制函数没有副作用(所谓的“纯”函数)。

答案 1 :(得分:3)

  

但不幸的是,它允许在常量成员函数中访问和修改非常量全局变量(为什么??)。

因为全局变量不是类的一部分。全局变量是全球变量。如果您不希望每个人都有权访问,请不要将其设为全局。

constness仅适用于访问类的其他(非可变)成员的成员函数。这并不意味着“这个功能不会改变任何地方”

答案 2 :(得分:1)

它在C ++中是允许的,但是你受到的规则多于你想要的全局规则

您必须声明您的函数constexpr。这意味着该函数必须是可由编译器评估的形式。显然你不能修改变量,因为它们还不存在,所以你的全局变量是安全的。但你也不能通过调用另一个非constexpr函数偷偷摸摸地做到这一点。没有循环,没有什么花哨,只有一个回复声明。

答案 3 :(得分:0)

如上所述,我要远离全局变量,但有可能将它们全部包装在一个类中,从那时起你就可以利用const成员函数,并使该类的实例成为全局变量。超级简单的例子:

class Globals
{
public:
  Globals( int valueA ) :
    valueA( valueA )
  {
  }

  int ValueA() const
  {
    return 
  }

  //this one can be read/written to so no real need for getter/setter
  //unless you want thread-safety, then you'd add a getter/setter
  //with a mutex inside
  int valueB;

private:
  int valueA;
};

//somewhere in the source
Globals globals( 2 );