【问题标题】:c++ - difference between const and static keyword in function headerc++ - 函数头中 const 和 static 关键字的区别
【发布时间】:2014-04-03 06:03:12
【问题描述】:

考虑以下代码:

class Test
{
public:
   //1
   int kon1() const;

   //2
   const int kon2();

   //3
   static int kon3();
};

据我所知,功能1和2的区别在于:

  1. 函数 1 表示该函数将无法更改任何数据成员的值
  2. 函数 2 表示它将返回一个 const int

(如果理解有误,请指正)

我的问题是: 正如我们在那里看到的,如果我们想让一个函数成为 const 函数,则 const 关键字放在后面。但是为什么在函数3,静态函数中,static关键字放在前面呢?

【问题讨论】:

  • 因为语言是这样定义的? (具体来说,这是从 C 继承的。)
  • 函数 1 表示任何变量或对象的状态都不应该改变,但它可以改变可变变量的状态。
  • 您的代码回答了您自己的问题 - 它不能在前面,或者您无法区分返回 intconst 函数和返回的非 const 函数const int。不过,这些选择确实看起来很随意……例如virtual 在前面,override 在后面....
  • @OliCharlesworth 我知道格式已定义,但我对这个答案不太满意
  • @TonyD 感谢您澄清我的理解,但我在问函数 1 2 3 之间的区别,在我的问题中用粗体表示:)

标签: c++ static constants qualifiers


【解决方案1】:

对于const,成员函数后面必须有const 关键字以避免与返回类型产生歧义。

对于staticvirtual 和其他对函数工作方式有显着影响的关键字,最好先列出它,以便在类定义中更容易看到。例如,我们可以快速浏览成员函数列表并找出所有 static 函数或所有 virtual 函数 - 帮助我们了解函数的整体使用情况。

标记成员函数const(或例如override)是一个不太重要的区别 - 如果您有一个非const 对象,您可以调用函数,无论它们是否为const,适当的const-ness 对于阅读开发人员来说通常很明显,因为它们吸收了函数返回类型和标识符,并且在某些公司/项目编码标准中,变异函数被分组在 const-accessors 或 const 和非@987654334 之上相同成员函数的 @ 版本并排强调它们的相似之处 - 然后不同的 const-ness 更加突出。

所有这些因素结合在一起,使 C++ 中的实际选择最适合开发,但您发现它们有点不一致是对的。

【讨论】:

    【解决方案2】:

    您混合了两个概念,即存储类和存储类型。

    C++ 有以下几种存储类

    自动、注册、静态、外部和可变

    以及以下类型的存储类型(基于您可以在存储上做什么)

    只读(可以初始化)-->这是const

    读写 --> 这是非常量。

    所以当你定义一个变量/函数时,你已经提前告诉你想要关联什么样的存储类型。这就是为什么你把 static 作为你的代码中的第一个关键字。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      关键字static 不会修改变量的类型。它修改了它所在的内存地址。它同样用于函数类型变量和数据类型变量:

      static int n;     // data
      static int n ();  // function
      

      关键字const 确实修改了变量的类型。对于函数类型的变量,这个关键字有两种可能的含义:

      1. 修改函数返回值为const类型:

        const int n (); // 函数只能从非 const 对象调用,并返回一个 const 值

      2. 修改这个函数的调用方式

        int n () 常量; // 函数可以被 const 和 non-const 对象调用,并返回一个 non-const 值`

      【讨论】:

      • 第二点“函数只能从 const 对象调用”。认为这可能会令人困惑,或者我的概念不清楚。我认为它可以从未声明为 const 的对象中调用。只有它会充当 const 对象,因为除了可变变量之外,该函数内部不能修改任何成员变量。
      • 它不会“修改内存地址”。在函数中使用时,它会修改对象的生命周期。在函数之外使用时,它会修改对象或函数的可见性。
      【解决方案4】:
       int kon1() const;
      

      此函数是只读函数,仅适用于 const 数据。

         const int kon2();
      

      这个函数可以作用于可修改的对象,但它返回的类型是只读的,调用者不能修改它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2017-07-06
        相关资源
        最近更新 更多