2013-02-04 165 views
-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); 
}; 

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成员函数改变静态成员变量类的,从而改变常量成员函数foo的结果。

对于my_static_int,您可以声明bar为const吗?

+3

没有办法做到这一点,你误解了'const'的含义。 'const'只意味着这个函数不会修改任何非'mutable'成员变量_,而不是每次调用它时都会“具有相同的输出”。例如,如果你在'const'成员函数中有一个'static'变量,并在每次调用时递增并返回它呢?它仍然是'const',但每次都返回一个不同的值。 –

+0

@SethCarnegie没错。我问了这个问题,因为似乎没有办法将“常量”静态成员函数与“非常量”静态成员函数区分开来,其中“常量”是关于静态成员变量的。 – cmo

+0

@SethCarnegie不,我没有理解const的含义。我实际上表明了我对这个问题的理解。相反,你显然没有阅读我的问题,因为你的“评论”仅仅提出了我的问题提出的另一个例子。 – cmo

回答

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人迹罕至,默认:它是无法使用的。

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

你然后问:

“你可以声明barconst相对于my_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) {} 
}; 
2

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

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

这深深地困扰着我,因为人会承担 const成员函数foo多个电话中的类

你不应该假设不会改变任何事情。 const方法可能会修改静态变量,因为这些变量不是正在声明为const的实例的一部分。

它也可以修改标记为mutable的变量。或者已经删除了const_cast的成员。

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

this question更好地了解C++的const意义