【问题标题】:Is the term "method" defined by the C++ Standard?术语“方法”是否由 C++ 标准定义?
【发布时间】:2015-04-18 17:05:15
【问题描述】:

术语“方法”通常用于讨论 C++ 代码。独立术语在 C++ 中有明确定义的含义还是模棱两可?是否可以单独使用该术语,或者是否应该对其进行限定(例如“类方法”或“虚拟方法”),还是应该完全避免使用?

【问题讨论】:

  • 规范使用了诸如functionmember functionvirtual function之类的术语,而不是方法。

标签: c++ terminology language-lawyer


【解决方案1】:

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

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

【讨论】:

  • 好答案。但是 virtual 成员函数与成员函数不同,更重要的是,它不是成员函数的默认值(默认情况下,它是非虚函数)。
  • 这使它更加模棱两可。虽然坦率地说,当我看到非标准术语中使用的“方法”时,我总是会想到“成员函数”。
  • @GiulioFranco 我同意。 OOp 的通常定义是调用数据属性和行为方法。我不确定为什么 Bjarne Stroustrup 认为它是虚拟的。他可能引用了暗示多态性的方法定义(即与对象而非其类相关联的行为)。
  • Bjarne 做了很多事情,每一个是否“可接受”还有待商榷。
  • @GiulioFranco - 在 Java 中,最终方法仍然是方法。
【解决方案2】:

我会完全避免这个词,因为很清楚你所说的“成员函数”是什么意思,而不是“方法”——你问这个问题就足够证明了。

然而,“方法”一词在 C++14 标准中的规范外观是

  • 在内容列表中:

    17.5 描述方法(资料性)

    这在该部分的标题中重复。

  • [basic.compound]:

    这些构造类型的方法可以递归应用;

  • [cpp.include]

    序列的方法 <> 预处理令牌对或一对 " 字符之间的预处理令牌的组合 到单个标头名称预处理标记是实现定义的。

  • [图书馆.一般]

    以下子条款描述了定义 (17.3)、描述方法 (17.5)、[..]

  • 在表 32 中,提到了FLT_EVAL_METHOD

  • num_getdo_get的第2阶段:

    对于算术类型,插入punct.thousands_sep() 字符 进入由返回的值确定的序列 punct.do_grouping() 使用方法 22.4.3.1.2

  • [forwardlist.modifiers]:

    否则,在末尾插入sz - distance(begin(), end()) 元素 该列表使得每个新元素 e 都由一个等效于调用 allocator_traits<allocator_type>::construct(get_allocator(), std::addressof(e), c)方法进行初始化。

  • [filebuf.virtuals]:

    根据描述的行为 basic_streambuf<charT,traits>::uflow(),具有专业化 使用相同的方法从输入中读取字符序列 被underflow使用。

该术语显然从未指代“成员函数”。

【讨论】:

  • 这基本上复制了我的部分答案:a simple Google search reveals more occurrences of this term.
【解决方案3】:

C++ standard 没有提到术语method。需要注意的是,official C++ FAQ确实使用了这个术语,但是用来描述一个virtual的功能; simple Google search 揭示了该术语的更多出现。

我从未在 IDE (Visual Studio) 中见过术语 method,但我见过术语 member function。在我看来,method 是一个“一刀切”的术语。

【讨论】:

    【解决方案4】:

    “方法”一词在历史上曾被用作对象过程的同义词。考虑到一个对象既有数据又有行为,这种行为被称为方法。 往回追溯,当提到 MIT ALGOL 版本 AED-0 时,我可以找到对术语方法的使用的参考

    Quoting wikipedia

    MIT ALGOL 版本,AED-0,链接数据结构(“plex”,在 方言)直接与程序,预示着后来被称为 “消息”、“方法”和“成员函数”。

    多年来,方法一直是面向对象分析和设计以及面向对象编程的一个组成部分。现在 C++ 演变为一种过程语言,它扩展了 C 一种过程语言以具有面向对象的功能。 C有结构的概念,数据元素称为成员。请参阅Methods in C++。 为了不破坏血统,C++ 继续将结构化和较新的流派类的元素称为成员。

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

    因此,严格来说,官方引用在引用成员函数时避免使用术语方法。该术语在具有更多面向对象背景的人中最为普遍。因此,如果您想保持明确,最好将术语用作

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

    【讨论】:

    • 请使用引用格式来明确这其中有多少是你自己的话,有多少是别人写的。
    • @LightningRacisinObrit:请详细说明哪一部分不清楚?我已按要求适当引用。 Downvoter:你能帮我理解哪个部分没有帮助或不正确吗?
    • 是什么让您认为反对票是“异想天开”或“没有任何适当理由”?
    • 我的第一条评论充分解释了这个问题。我相信您现在已经对其进行了充分的纠正。
    • @LightningRacisinObrit:您在第一条评论中提到的内容绝不会使答案毫无帮助。此外(不是理由),当您发表评论时,答案正在被格式化。在任何情况下,据我所知,当内容正确且有用时,2 次投反对票并不保证投反对票。
    【解决方案5】:

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

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

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

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

    关于 C++,正确的术语是:成员/非成员函数。 有些人使用会员/免费功能。

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多