-2

在 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 );
};

我的类.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;
}

主文件

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

输出将是:

yourint  >  myint + my_static_int
yourint  <= myint + my_static_int

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

你可以声明bar为 constmy_static_int吗?

4

2 回答 2

3

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

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,默认情况下一切都是不可访问的:它是不可用的。

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

然后你问:

“你能声明就bar?”constmy_static_int

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

您将不得不使用现有的语言功能。

它们足以胜任这项任务。

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 ) {}
};
于 2013-02-04T18:47:32.080 回答
2

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

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

这深深困扰着我,因为人们会假设多次调用 const 成员函数 foo 不会改变类中的任何内容

你不应该这样假设。const 方法可以修改静态变量,因为这些变量不是声明为 const的实例的一部分。

它还可以修改标记为 的变量mutable。或者用 . 移除了 const-ness 的成员const_cast

并且const函数可以观察或修改类之外的变量,所以你永远不应该考虑一个const函数每次被调用时的行为方式都是一样的。例如,您可以有一个const函数返回rand()

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

于 2013-02-04T18:42:23.990 回答