我要求将非成员函数设为常量,即我希望强制它不允许对全局变量进行任何修改。
我知道非会员功能是不可能的,但是想知道是否有解决方法。
我想到的一种方法是为此声明一个带有常量成员函数的单独类,并访问const全局变量。但不幸的是,它允许在常量成员函数中访问和修改非常量全局变量(为什么??)。
答案 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 );