【问题标题】:Const static method modifies valuesconst 静态方法修改值
【发布时间】:2012-11-09 06:00:31
【问题描述】:

我正在尝试使用 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.5,我期待编译器出错,因为我有一个尝试修改参数值的 const 方法。

我在这里缺少什么?我如何设计不会修改参数值的方法?

【问题讨论】:

  • 呵呵,我不知道你可以申请constvoid
  • 其实你的意思是 static const void modify(const float& dummy)?在这种情况下,你不能修改 dummy
  • @chris 我如何编写一个类似的方法来保持我的论点不变?为什么我没有收到警告?
  • 嘿,看看我从 GCC 得到什么:警告:函数返回类型 [-Wignored-qualifiers] 上忽略类型限定符
  • @billz 是的,但我怀疑是否使用 const 作为方法本身的类型。

标签: c++ constants


【解决方案1】:
  1. 您声明的方法不是const。它返回一个const void(不管是什么),但它本身不是const-方法。

  2. 如果它被声明了

    void modify(float& dummy) const
    

    这将是一个 const 方法,但它仍然可以修改参数的值,因为允许 const 方法执行此操作。它唯一不允许做的就是修改它所属的类的成员的值。

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

  4. 如果你想阻止函数修改它的参数,你必须将参数设为 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
  }  
};

如您所见,它不能修改成员,但可以修改其参数的值。如果你想防止这种情况发生,你需要提出const的论点:

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

【讨论】:

  • 所以第 4 点是解决这个问题和所有 void 方法的唯一方法?
  • 没有它以防止参数修改。
  • @user1802174,这是每个功能的唯一解决方案。返回类型与它无关。
  • @chris 我确信使用 const 可以将每个参数放入保险箱中。可能不是……
  • 我知道,我没有困惑;在标准中不为“const void”定义特殊情况是很有意义的。但这并不意味着编译器不应该警告这样的事情,即使严格来说,它是“符合标准的”。
【解决方案2】:

您误解了 'const' 在这种情况下的作用及其运作方式。

首先,在 C++ 中静态成员函数不能是 const。您显示的函数返回一种“const void”(这是否有意义以及编译器是否应该发出警告是另一个话题)。

您要更改的所有参数中的第二个不是 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
}

如果你希望参数为 const,则将参数设为 const:

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.
}

【讨论】:

  • 谢谢,不幸的是,由于我的声誉低下,我无法对此投赞成票,但这是一个很好的回应,谢谢。
  • 不用担心 - 这与投票无关;这是关于问题和答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2012-07-01
相关资源
最近更新 更多