我最近发现你可以在函数声明及其实现中从值参数中添加和删除cv-qualifier。例如:
F.h
f(const int i);
F.cpp
f(int i) { i++; }
TEST.CPP
#include "F.h"
f(0);
将调用f(int i)实现。由于它是按值复制的,我发现代码编译没有问题。但是,任何人都可以想象一个案例,如上所述,将 const 添加到声明中是有用的吗?为什么可能呢?也许有人可以提供更有用的应用程序?
答案 0 :(得分:3)
忽略函数参数的顶级CV限定符,即它们不是函数签名的一部分。相反,如果您愿意,它们是函数的实现的一部分,因为它们限定了与形式函数参数对应的本地变量。因此,如果您满意,您可以在函数定义中限定函数参数:
int power(int val, int n, int base);
int power(int val, int n, const int base)
{
while (n --> 0) val *= base;
return val;
}
如果定义具有来自声明的不同外观的函数参数,有些人会发现它令人反感。这是品味和风格的问题。限定参数的好处可能很小,但在记录您不打算更改变量时,实现有一些价值。
答案 1 :(得分:0)
有些人喜欢在他们的定义中声明他们不会更改参数,即使它只在本地可见。例如:
void f(int);
void f(int const);
void f(int const x) {
x = 3; // ERROR!
}
定义是刚刚声明的函数,即签名没有变化(好吧,除非您碰巧使用Sun的CC实际上将const
考虑到了错误的名称,但这只是一个错误)。所有三个签名都声明完全相同的函数,const
仅影响定义的主体(如果在定义的声明中使用它)。