C++标准中是否定义了术语“方法”?

19

“方法”这个术语经常用于讨论C++代码。“方法”这个词在C++中是否有明确定义的含义,还是含义不清?是否可以仅使用这个词本身,或者应该加以限定(例如“类方法”或“虚方法”),或者根本应该避免使用?


5
规范中使用词汇如“function”、“member function”、“virtual function”,而非方法(method)。 - Nawaz
5个回答

15

方法这个术语在C++标准中没有定义。术语使用成员函数代替。

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


很好的回答。但是虚拟成员函数与成员函数不同,更重要的是,它不是成员函数的默认设置(默认情况下,成员函数是非虚拟的)。 - Giulio Franco
1
@GiulioFranco 我同意。 OOP 的通常定义是调用数据属性和行为方法。我不确定为什么 Bjarne Stroustrup 将其视为虚拟的。可能他参考了一个方法定义,这暗示着多态性(即与对象而不是其类相关联的行为)。 - Christophe
5
Bjarne 做了很多事情,每件事情是否“可接受”存在争议。 - Lightness Races in Orbit
1
@GiulioFranco - 在Java中,final方法仍然是一个方法。 - Pete Becker
@PeteBecker 但是最终方法仍然是虚拟的,不是吗?以C++的final为例:http://en.cppreference.com/w/cpp/language/final。它只能应用于`virtual`函数。 - chbaker0
显示剩余3条评论

8
我建议完全避免使用这个术语,因为“成员函数”很明显,但是“方法”不够清晰-你提出这个问题就足以证明这一点。
然而,在C++14标准中,单词“方法”的规范外观如下:
- 在目录中: - 17.5描述方法(信息性) - 这在该部分的标题中重复出现。 - [basic.compound]: - 可以递归地应用这些类型构造的方法; - [cpp.include] - 将位于<和>预处理令牌对或一对“”字符之间的预处理令牌序列组合成单个头文件名预处理令牌的方法是实现定义的。 - [library.general] - 下面的子条款描述了定义(17.3)、描述方法(17.5)等。 - 在表32中,提到了FLT_EVAL_METHOD。 - 在num_get的do_get的第2阶段中: - 对于算术类型,根据punct.do_grouping()返回的值使用22.4.3.1.2中描述的方法将punct.thousands_sep()字符插入序列中。 - [forwardlist.modifiers]: - 否则,在列表末尾插入sz-distance(begin(),end())个元素,使得每个新元素e都由一个与调用allocator_traits::construct(get_allocator(),std::addressof(e),c)等效的方法初始化。 - [filebuf.virtuals]: - 行为与basic_streambuf::uflow()的描述相符,特化是从输入中读取一系列字符,并使用与underflow使用的相同方法。
该术语显然从未涉及“成员函数”。

这基本上是我的回答的一部分:“简单的谷歌搜索会显示更多此术语的出现次数。” - AStopher

1
这里是关于“方法”一词的分析。
我对多种编程语言的官方文档(标准、规范等)进行了扫描。

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

未来一篇文章将发布关于充分的分类法(不依赖于任何编程语言)。
关于C ++,正确的术语是:成员/非成员函数。有些人使用成员/自由函数。

1

C++标准中没有提到术语method。需要注意的是,官方C++ FAQ确实使用了这个术语,但是用于描述一个virtual函数;简单的谷歌搜索可以发现更多此术语的出现。

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


1
术语“方法”在历史上曾被用作对象过程的同义词。考虑到对象既有数据又有行为,这个行为就被称为方法。追溯历史,可以找到一个关于使用术语“方法”的参考,它指的是MIT ALGOL版本AED-0。
参见维基百科引述所述:MIT ALGOL版本AED-0直接将链接数据结构(在该方言中称为“plexes”)与程序相关联,预示了后来所称的“消息”、“方法”和“成员函数”。
多年来,“方法”一直是面向对象分析和设计以及面向对象编程的重要组成部分。现在,C++已经发展成为一种过程性语言,它扩展了C语言的面向对象功能。C语言具有结构的概念,数据元素称为成员,请参阅C++中的方法。为了不打破血统,C++继续将结构化元素和新型类别称为成员。
现在,为了区分数据和函数,C++语言没有引入新的术语,而是将数据成员和成员函数称作扩展术语。支持动态绑定的成员函数被称为虚函数。
严格来说,官方参考文献不使用“方法”这个术语来指代成员函数。这个术语在那些具有更多面向对象背景的人中最为普遍。因此,如果想保持明确性,最好使用以下术语:
- 数据成员 - 成员函数 - 虚函数

1
请使用引号格式,清楚地表明多少是您自己的文字,多少是其他人写的。 - Lightness Races in Orbit
@LightningRacisinObrit: 请详细说明哪一部分不清楚?我已经按要求适当引用了。Downvoter:您能否帮助我理解哪一部分不有用或不正确? - Abhijit
1
什么让你认为这些踩票是“随意的”或“没有任何合适的理由”的? - Lightness Races in Orbit
1
我的第一条评论已经充分解释了问题。我相信你现在已经适当地纠正了它。 - Lightness Races in Orbit
@LightningRacisinObrit:你在第一条评论中提到的内容并没有使答案变得无用。此外(不是为了辩解),当你发表评论时,答案正在被格式化。无论如何,在我看来,当内容正确且有帮助时,两个踩并不足以导致另一个踩。 - Abhijit
“Method”是由Smalltalk引入的。在早期的编程语言中,没有使用“method”这个词。因此我认为,“method”这个词不够“历史悠久”。 - Fernando Pelliccioni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接