c ++ - 函数头中const和static关键字的区别

时间:2014-04-03 06:03:12

标签: c++ static const qualifiers

请考虑以下代码:

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

   //2
   const int kon2();

   //3
   static int kon3();
};

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

  1. 功能1表示该功能无法更改任何数据成员的值
  2. 函数2表示它将返回一个const int
  3. (如果我的理解有误,请纠正我)

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

4 个答案:

答案 0 :(得分:3)

对于const成员函数,之后必须使用const关键字,以避免返回类型的歧义。

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

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

所有这些因素结合在一起使得C ++中的实际选择最适合开发,但你正确地观察到它们有点不一致。

答案 1 :(得分:0)

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

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

关键字const会修改变量的类型。对于函数类型变量,此关键字有两种可能的含义:

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

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

  2. 修改如何调用此函数

    int n()const; //函数可以调用const和非const对象,并返回非const值。

答案 2 :(得分:0)

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

C ++有以下类型的存储类

auto,register,static,extern&可变

以下类型的存储类型(基于您在存储时可以执行的操作)

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

读写 - >这是非常数。

因此,当你定义一个变量/函数时,你已经预先知道了你想要关联的存储类型。这就是为什么你把静态作为你的代码中的第一个关键字。

希望这有帮助。

答案 3 :(得分:0)

 int kon1() const;

此函数是readonly函数,仅用于处理const数据。

   const int kon2();

此函数可以在可修改的对象上工作,但它返回的类型是readonly,调用者不能修改它。