函数中的const限定符

const qualifier in a function

本文关键字:const 函数      更新时间:2023-10-16

关于使用"const"限定符,这三个函数之间有什么区别

int& func (const int& var)

我知道const限定符将输入保持为只读,并且不能在函数内部更改。

int const func (int& var)

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

int& func (int& var) const

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

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

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

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

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

突出显示的部分是函数的返回类型声明。返回类型是const int对象。尽管它的格式很好,但返回const int从来都没有意义,因为const与调用者无关。大多数编译器都可以选择在出现此类声明时发出警告。

从技术上讲,返回常量类对象可能与返回非常量类对象不同,但我还没有见过这样有用的情况。

int& func (int& var) const

参数列表后的Const应用于函数本身。不能对非常量对象或引用调用常量成员函数。成员函数的隐式*this参数将是常量。Const限定符不能应用于非成员函数或静态成员函数。


关于这个问题的旧版本。。。

关于使用";const";修改

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

这两个是不正确的。Const限定符不能应用于引用(尽管可以引用Const类型,并且这种引用通常称为Const引用)。

您需要从右到左阅读常量量词才能理解它们。因此,例如int const func(int&var)返回一个const int

下面是一个使用示例:

#include <stdexcept>
#include <iostream>
int& func(const int& var)
{
std::cout << "func(const int& var) calledn";
throw std::runtime_error("not implemented");
}
int const func(int& var)
{
std::cout << "func(int& var) calledn";
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 calledn";       
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) {}
}