静态成员函数,它们是关于静态变量的const

时间:2013-02-04 18:33:41

标签: c++ constants static-methods static-members

在C ++中,如何针对该类的 static 成员变量声明类的静态成员函数为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为{{1}}?

2 个答案:

答案 0 :(得分: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 ) {}
};

答案 1 :(得分:2)

  

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

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

  

这让我很烦恼,因为人们会假设多次调用   const成员函数foo不会改变类中的任何内容

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

它还可以修改标记为mutable的变量。或者已使用const_cast删除其常量的成员。

并且const函数可以观察或修改类之外的变量,因此您不应该考虑const函数在每次调用时都以相同的方式运行。例如,您可以返回const函数返回rand()

请参阅this question以更好地理解C ++中const的含义