3

我最近发现您可以在函数声明及其实现中从值参数中添加和删除 cv-qualifier。例如:

频率

f(const int i);

F.cpp

f(int i) { i++; }

测试.cpp

#include "F.h"
f(0);

将调用 f(int i) 实现。由于它是按值复制的,因此我认为代码编译没有问题。但是任何人都可以想象这样一种情况,在这种情况下,将const添加到上面所做的声明中会有所帮助吗?为什么完全有可能?也许有人可以提供更有用的应用程序?

4

2 回答 2

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;
}

但是,如果定义具有与声明不同的函数参数,有些人会觉得很冒犯。这是品味和风格的问题。限定参数的好处可能很小,尽管在记录您不打算更改变量时实现有一些价值。

于 2014-01-15T20:51:14.833 回答
0

有些人喜欢在他们的定义中声明他们不会更改参数,即使它仅在本地可见。例如:

void f(int);
void f(int const);

void f(int const x) {
    x = 3; // ERROR!
}

定义是刚刚声明的函数,即签名没有变化(好吧,除非您碰巧使用 Sun 的 CC,它实际上考虑const了损坏的名称,但这只是一个错误)。所有三个签名都声明了完全相同的函数,并且const如果在定义的声明中使用它,则唯一会影响定义的主体。

于 2014-01-15T20:44:08.490 回答