C++ 常量静态方法修改值

C++ 常量静态方法修改值,c++,constants,C++,Constants,我正在试验const关键字,并试图从中获得一种有用的方法 #include <iostream> class A { public: static const void modify(float& dummy) { dummy = 1.5f; } }; int main(int argc, char* argv[]) { auto a = 49.5f; A::modify(a); std::cout << a <

我正在试验
const
关键字,并试图从中获得一种有用的方法

#include <iostream>

class A
{
  public:
  static const void modify(float& dummy)
  {
    dummy = 1.5f;
  }  
};

int main(int argc, char* argv[])
{
  auto a = 49.5f;

  A::modify(a);

  std::cout << a << std::endl; 

  return(0);
}
#包括
甲级
{
公众:
静态常量无效修改(浮动和虚拟)
{
假人=1.5f;
}  
};
int main(int argc,char*argv[])
{
自动a=49.5f;
A::修改(A);
标准::cout
  • 您声明的方法不是
    const
    。它返回一个
    const void
    (不管是什么),但它本身不是
    const
    -方法

  • 如果它被宣布

    void modify(float& dummy) const
    
    它可能是一个const方法,但它仍然可以修改参数的值,因为const方法可以这样做。它唯一不允许做的事情是修改它所属类的成员的值

  • 请注意,为了声明
    const
    方法,我必须删除
    static
    规范。
    static
    方法永远不能是
    const
    ,因为静态方法无论如何都不能修改任何成员

  • 如果要防止函数修改其参数,必须使参数为常量:

    static void modify(const float& dummy)
    

  • 为了说明const方法可以做什么和不能做什么,下面是一个具有成员和const函数的类:

    class A
    {
      float my_member;
    public:
      void modify(float& dummy) const
      {
        my_member = dummy; // attempt to modify member -> illegal
        dummy = 1.5f;      // modifies a non-const argument -> ok
      }  
    };
    
    如您所见,它不能修改成员,但可以修改其参数的值。如果要防止出现这种情况,需要将参数设置为常量:

    class A
    {
      float my_member;
    public:
      void modify(const float& dummy) const
      {
        my_member = dummy; // attempt to modify member -> illegal
        dummy = 1.5f;      // attempt to modify a const reference -> illegal
      }  
    };
    

    您误解了“const”在这种情况下的作用以及它的运行方式

    首先,C++中的静态成员函数不能是const。你所显示的函数返回一个“const虚”类型(这是否合理,编译器是否应该警告是另一个主题)。 您正在更改的第二个参数不是常量。如果“modify”不是静态函数,并且函数上有一个“const”修饰符,则仍可修改dummy:

    void modify_nonstatic(float &dummy) const
    {
        dummy = 1.5f; // perfectly fine - dummy isn't a member of
                      // the class and can be modified
    }
    
    如果希望参数为常量,请将参数设置为常量:

    static void modify(const float &dummy) 
    {
        dummy = 1.5f; // fail! you can't modify a const.
    }
    
    void modify_nonstatic(const float &dummy)
    {
        dummy = 1.5f; // fail! you can't modify a const.
    }
    

    嗯,我不知道你可以将
    const
    应用于
    void
    。实际上你指的是静态const-void-modify(const-float&dummy)?在这种情况下,您不能修改dummy@chris我如何编写一个类似的方法来保持参数不变?为什么我没有得到警告?嘿,看看我从GCC得到了什么:警告:函数返回类型[-Wignored qualifiers]上忽略类型限定符@billz是的,但我怀疑的是在方法本身的类型中使用const。因此,第4点是该方法和所有无效方法的唯一解决方案?不,它是为了防止参数修改。@user1802174,它是每个函数的唯一解决方案。返回类型与此无关。@chris我确信使用const可以在保险箱里,这可能不是…我知道,我并不困惑;在标准中不定义“const void”的特殊情况是很有意义的。但这并不意味着编译器不应该警告类似的事情,即使严格来说,它是“符合标准的”.谢谢,不幸的是,由于我的名声不好,我无法提高投票率,但这是一个很好的回答,谢谢。不用担心,这不是提高投票率的问题,而是问题和答案的问题。