这三个函数与使用“ const”限定符有什么区别
int& func (const int& var)
我知道const限定词将输入保持为只读,并且无法在函数内部进行更改。
int const func (int& var)
这个也返回const变量,但这是什么意思呢?这意味着它不能通过代码进行更改?
int& func (int& var) const
那这个呢?我不知道这意味着什么。
答案 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) {}
}