const关键字在方法声明中的不同位置?

时间:2013-10-01 07:27:42

标签: c++ methods comparison const

对于stackoverflow上的类似问题有一些答案,但所有这些都是不完整的或没有比较(使用不同的示例)。我看到至少3种可能的声明案例:

  1. const void f();
  2. void f() const;
  3. const void f() const;
  4. 他们之间有什么区别?

    我发现的唯一区别是以下代码仅适用于(2)或(3):

    const foobar fb;
    fb.foo();
    

5 个答案:

答案 0 :(得分:7)

    此位置的
  1. const将返回类型声明为const
  2. 此位置的
  3. const仅适用于成员函数,表示该函数不能/不会修改任何成员非mutable变量(对象常量)。
  4. 这是以上2个组合。

答案 1 :(得分:3)

方法名称之前的const(如第1点,以及问题的第3点)是指返回类型。这意味着函数的结果是不可修改的;但是这个const实际上有意义的时候是有限的 - 基本上,它通常只对用户定义的类型有意义。但是在void返回类型的上下文中它意味着什么,我现在还不知道。我最好的猜测是它被编译器忽略了。

方法名称后面的const(如第2点和第3点所示)使整个方法成为常量,这意味着该方法可能不会修改任何成员(除了声明的mutable)。

由于您的foobar变量被声明为const,因此可能无法修改,因此只能调用const个方法,这就是为什么只有2.和3.工作(它们都是声明方法 const;在1.它只是返回类型是const!)

答案 2 :(得分:1)

1)    const void f();

返回类型称为常量。在模板中的示例中很有用,其中忽略了void上的cv资格或者在编译器实现和最终用户代码方面使它们成为错误could create unnecessary complexity。例如:

  template<typename T>
  const T ...

函数的返回值是右值。 non-const类型的Rvalues不是 cv-qualified ,因此void const与简单void相同 - 在这种情况下忽略const。虽然const void不是很有用,但const void*有其用途。 g ++确认const void可能很重要,因为以下代码无法编译

#include <type_traits>

static_assert(std::is_same<void(), const void()>::value, "const matters");

2)    void f() const;

指的是成员类。这是声明不更改类/结构的任何(不可变)成员的函数,也不返回任何允许修改它而不“破坏”const的东西。这就是为什么只能在常量对象上调用这样的函数

const foobar fb;
fb.foo();  // OK

但是

void f();
const foobar fb;
fb.foo(); // error

最后

3)    const void f() const;

以上两者

答案 3 :(得分:1)

通常,const会修改它前面的内容(和 应该在它修改之后立即写入)。 在您显示的案例中:

const void f();

const被忽略。不要写这样的东西;它让人困惑 读者。

void f() const;

这声明了一个“const”函数(因为const是 紧接着是函数声明。的概念 const函数有点特殊:它只适用于 非静态成员函数,它表示类型 this将是T const*,而不是T*。在实践中,它是 作为承诺不修改可观察状态 对象函数被调用。

const void f() const;

与先例完全相同。第一个const是 忽略。

当然,还有许多其他地方const可以出现:

void const* f();
例如,

声明一个返回指针的函数 一个空洞。 (您经常会将其视为

const void* f();

如果const之前没有任何内容,那么它适用于什么 如下。但是,作为一般规则,最好避免 这种风格,即使它非常普遍。)

请注意您与第一篇文章的区别 例。这里,返回类型是一个指针,const 适用于指向的内容,而不是指针(指针) 是void *const)。虽然忽略了顶级const 非类返回类型(因此void *const f();与...相同 void* f();),对于其他const, 为真。

答案 4 :(得分:0)

在某些情况下会使用const关键字(包括您询问的关键字以及更多关键字)

<强> 1。声明的常量

  

const int constant_variable = 2;

在为值赋值后,不能更改常量变量(上例中的constant_variable)值。

2.常规会员职能

  

Class Foo {        int a_member_func()const;        int a_member_variable;        mutable int mutable_variable; };

禁止常量成员函数更改其对象的成员变量。在这种情况下,a_member_func()不允许更改a_member_varialbe,但特殊情况是常量成员函数可以更改标记为mutable的成员变量的值(a_member_func()可以更改{{ 1}})

3.Const参考参数和Const指针参数

  

int a_func(const int&amp; a,const int * b);

在这种情况下,mutable_variable不允许更改a_func()a的值。常量引用参数和常量指针参数不能通过它们传递给的函数来改变。

4.常量返回类型函数

  

const int a_func();

在函数返回类型前面使用的常量函数(b关键字)总是返回一个常量值。这意味着const返回一个常量值。

这不是const关键字用法的完整列表。