相对于静态变量为常量的静态成员函数

Static member functions that are const with respect to static variables

本文关键字:静态成员 函数 常量 静态 变量 相对于      更新时间:2023-10-16

在C++中,如何将类的静态成员函数相对于该类的静态成员变量声明为const

考虑以下简单示例。

myclass.h:

class myclass
{
    myclass()
    {
        myint = 0;
    }
    ~myclass() { }
    int myint;
    static int my_static_int;
    void foo(const int yourint) const;
    static void bar(const int newint );
};

myclass.cpp:

myclass::my_static_int = 0;
void myclass::foo(const int yourint) const
{
  if (yourint <= myint + my_static_int)
     std::cerr << "yourint  <= myint + my_static_int";
  else
      std::cerr << "yourint  >  myint + my_static_int";
  bar( yourint );
}
void myclass:bar(const int newint)
{
  my_static_int = newint;
}

main.cpp

...
myclass A;
A.foo(4);
A.foo(4);
..

输出为:

yourint  >  myint + my_static_int
yourint  <= myint + my_static_int

显然,bar可以在const成员函数中使用来更改类的静态成员变量,从而更改const成员函数foo的结果。

你能把bar声明为相对于my_static_int的常量吗?

原始代码(我只整理了格式):

class myclass
{
    myclass()
    {
        myint = 0;
    } 
    ~myclass()
    {}
    int myint;
    static int my_static_int;
    void foo(const int yourint) const;
    static void bar(const int newint );
};

在这个类中,所有内容都是private不可访问,默认情况下:它不可用。

这就是为什么发布真实代码如此重要的一个例子。

然后你问:

“关于my_static_int,你能宣布barconst吗”

是的,但是没有直接的语法。

您必须使用现有的语言功能。

他们足以胜任这项任务。

class something
{
private:
    int my_int;
public:
    void bar( int const newint ) const;
    something();
};
class myclass
{
private:
    int myint;
    static something;
public:
    void foo( int const yourint ) const;
    ~myclass() {}
    myclass(): myint( 0 ) {}
};

您能声明bar相对于my_static_int是静态的吗?

没有。C++还没有提供这样的机制。

这让我深感困扰,因为人们会认为const成员函数foo不会更改类中的任何内容

你不应该这么认为。const方法可能会修改静态变量,因为这些变量不是被声明为const的实例的一部分。

它还可以修改标记为mutable的变量。或者已经用const_cast消除了恐惧的成员。

而且const函数可以观察或修改类外的变量,所以您永远不应该认为const函数每次被调用时都会有相同的行为。例如,您可以让const函数返回rand()

请参阅此问题以更好地理解const在C++中的含义