函数中的const限定词

时间:2019-01-05 04:18:23

标签: c++ const

这三个函数与使用“ const”限定符有什么区别

int& func (const int& var)

我知道const限定词将输入保持为只读,并且无法在函数内部进行更改。

int const func (int& var)

这个也返回const变量,但这是什么意思呢?这意味着它不能通过代码进行更改?

int& func (int& var) const

那这个呢?我不知道这意味着什么。

2 个答案:

答案 0 :(得分:1)

int& func (const int& var)
           ^^^^^^^^^^^^^^

突出显示的部分是参数声明。 const int&是参数变量的类型,var是变量的名称。

通常,constness适用于左侧,但在这种情况下,它是该类型最左侧的标记。在这种特殊情况下,它适用于权利。右边是int。因此,它是一个const int。总体而言,参数的类型是对const int的引用。

int const func (int& var)
^^^^^^^^^

突出显示的部分是函数的返回类型声明。返回类型是const int对象。尽管它的格式正确,但返回const int绝对没有意义,因为constness与调用者无关。大多数编译器都有在发生此类声明时发出警告的选项。

从技术上讲,返回const类对象可能与返回非const类对象不同,但是我没有看到这种情况有用的情况。

int& func (int& var) const
参数列表后的

Const适用于函数本身。不可在非const对象或引用上调用const成员函数。成员函数的隐式*this参数将为const。 const限定词不能应用于非成员函数或静态成员函数。


关于该问题的旧版本...

  

这三个函数与使用“ const”修饰符有什么区别

int& func (int& const var)
int& const func (int& var)

这两个格式不正确。 const限定词不能应用于引用(尽管您可以引用const类型,并且此类引用俗称const引用)。

答案 1 :(得分:0)

您需要从右到左阅读const量词以了解它们。 因此,例如 int const func(int&var)返回const int

以下是用法示例:

#include <stdexcept>
#include <iostream>

int& func(const int& var)
{
    std::cout << "func(const int& var) called\n";
    throw std::runtime_error("not implemented");
}

int const func(int& var)
{
    std::cout << "func(int& var) called\n";
    throw std::runtime_error("not implemented");
}

struct A {
    int& func(int& var) const
    {
        // i = 2; illigal since const function
        std::cout << "func(int& var) const called\n";       
        throw std::runtime_error("not implemented");
    }
    int i;
};

int main()
{
    try
    {
        const int i = 1;
        func(i);
    }
    catch (std::exception) {}

    try
    {
        int j = 2;
        func(j);
    }
    catch (std::exception) {}

    try
    {
        A a;
        int k = 2;
        a.func(k);
    }
    catch (std::exception) {}

}