术语 "method" 是由 C++ 标准定义的吗?

Is the term "method" defined by the C++ Standard?

术语 "method" 经常用于讨论 C++ 代码。独立术语在 C++ 中是否具有明确定义的含义,还是有歧义?单独使用该术语是否可以接受,或者它是否应该被限定(例如 "class method" 或 "virtual method"),或者应该完全避免使用它?

术语 方法 未在 C++ 标准中定义。该术语使用 成员函数

然而,

Bjarne Stroustrup 在他自己的 glossary 中将术语 方法 定义为 虚拟成员函数 。所以这表明该术语是可以接受的。

C++ standard makes no mention of the term method. It should be noted that the official C++ FAQ does make use of this term, but to describe a virtual function; a simple Google search 揭示了这个词的更多出现。

我从未在 IDE (Visual Studio) 中见过 method 这个词,但我见过 member function 这个词。在我看来 method 是一个 'one size fits all' 术语。

我会完全避免这个词,因为很清楚你所说的 "member function" 的意思,而不是 "method" - 你问这个问题就足够了。

然而,单词 "method" 在 C++14 标准中的规范出现是

  • 在内容列表中:

    17.5 Method of description (Informative)

    该部分的标题重复了这一点。

  • [basic.compound]:

    These methods of constructing types can be applied recursively;

  • [cpp.include]

    The method by which a sequence of preprocessing tokens between a < and a > preprocessing token pair or a pair of " characters is combined into a single header name preprocessing token is implementation-defined.

  • [library.general]

    The following subclauses describe the definitions (17.3), method of description (17.5), [..]

  • 在table32中提到了FLT_EVAL_METHOD

  • num_get 的第 2 阶段 do_get:

    For arithmetic types, punct.thousands_sep() characters are inserted into the sequence as determined by the value returned by punct.do_grouping() using the method described in 22.4.3.1.2

  • [forwardlist.modifiers]:

    Otherwise, inserts sz - distance(begin(), end()) elements at the end of the list such that each new element, e, is initialized by a method equivalent to calling allocator_traits<allocator_type>::construct(get_allocator(), std::addressof(e), c).

  • [filebuf.virtuals]:

    Behaves according to the description of basic_streambuf<charT,traits>::uflow(), with the specialization that a sequence of characters is read from the input with the same method as used by underflow.

这个词显然从来没有指代 "member function"。

术语方法在历史上曾被用作对象过程的同义词。考虑到,一个对象既有数据又有行为,正是这种行为被称为方法。 向后追溯,在提到 MIT ALGOL 版本 AED-0

时,我可以找到对术语方法用法的引用

Quoting wikipedia

MIT ALGOL version, AED-0, linked data structures ("plexes", in that dialect) directly with procedures, prefiguring what were later termed "messages", "methods", and "member functions".

多年来,方法一直是面向对象分析与设计和面向对象编程不可或缺的一部分。现在 C++ 发展成为一种过程语言,它扩展了 C 一种过程语言以具有面向对象的能力。 C有结构的概念,数据元素称为成员。参考Methods in C++。 为了不破坏沿袭,C++ 继续将结构化元素和较新的流派 class 称为成员。

现在,为了区分数据和函数,它没有引入新的术语,而是将这个术语扩展为调用数据成员和成员函数。支持动态绑定的成员函数称为虚函数。

所以,严格来说,官方参考文献在提到成员函数时,是避免使用术语方法的。该术语在具有更多面向对象背景的人群中最为流行。所以如果你想保持明确,最好使用术语 as

  • 数据成员
  • 成员函数
  • 虚函数

这里是我对方法这个词的分析。

我扫描了几种编程语言的官方文档(标准、规范等)。

http://componentsprogramming.com/using-the-right-terms-method/

适当的分类法(不依赖于任何编程语言)将在以后的文章中发布。

关于C++,正确的术语是:member/non-member函数。 有些人使用 member/free 函数。