在方法名称之前或之后放置const,static和virtual?

时间:2013-09-08 22:38:19

标签: c++ c++11

在开始之前,这不是一个风格意见问题。我想知道为什么以及如果我真的必须在函数之前放置存储修饰符。接下来是哲学讨论。

一位非常友好的C ++语法警察曾经教过我总是在修改doodad之后将修饰符放在对象上。例如:

int const myint; // good
const int myint; // bad

这个想法,我非常喜欢他或她的推理,然后修饰符将始终在它之前修改属性。因此,当我们声明一个方法时,逻辑约定如下:

const int const fun(); // bad
int const fun() const; // good

因此,假设这是我做事的方式,并且没有重新开始讨论,为什么我必须在函数之前放置存储修饰符(例如静态)?因此,彼此相邻的const和静态函数会令人困惑地看起来像这样:

int fun1() const;
static int fun2();

从概念上讲,这个上下文中的static和const关键字具有明确相关的角色(它们都修改了函数可以做什么和不能做什么,要广泛)不应该类似的语法规则适用于它们?我希望能够做到这一点:

int fun1() const;
int fun2() static; // why doesn't this work?

3 个答案:

答案 0 :(得分:3)

原因是staticconst完全不同。

具体来说,static指定了一个存储类,而constcv-qualifier(或仅qualifier,具体取决于您所查看的标准。)

因此,两者的规则相当不同。正如您已经发现的那样,其中一条规则是存储类说明符几乎是声明中的第一项,并且在大多数声明中只能指定一个存储类(我知道唯一的例外) :您可以指定thread_local以及staticextern)。

答案 1 :(得分:2)

声明staticvirtual函数与func() const之间存在很大差异,因为第一个函数定义了函数如何与它所属的对象进行交互,以及第二种形式定义允许对其所属的对象执行的操作。

而且,是的,一个人在功能原型之后,而另一个在之前,这有点令人困惑。我认为这是因为如果const char * const x = "abc"表示与const char * const func() { return "abc"; }不同的内容会更加令人困惑 - 并且最好将保留字的数量保持在语言中最小,因此添加“ constfunc“或类似保留词的东西被认为是个坏主意。通过将它放在函数声明中的()之后,它可以避免混淆并允许将相同的单词用于其他目的。

答案 2 :(得分:0)

const实际上并不修改函数,而是隐式this指针的类型。就C ++类型系统而言,所有函数都是不可变的(C ++不为自修改代码提供任何语言支持)。

因此,将其位置与返回类型或函数修饰符进行比较是没有意义的。