1

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

我知道非成员函数不可能,但想知道是否有解决方法。

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

4

4 回答 4

6

const的成员函数上的- 限定符T并不意味着该函数没有副作用:它意味着函数的隐式this参数具有 type const T*。换句话说,该函数不能修改非静态数据成员(好吧,无论如何都不容易)。

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

于 2013-07-16T18:34:52.277 回答
3

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

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

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

于 2013-07-16T18:34:02.137 回答
1

它在 C++ 中是允许的,但你受到更多规则的约束,而不仅仅是你想要的全局规则

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

于 2013-07-16T19:36:58.390 回答
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 );
于 2013-07-16T20:01:41.377 回答