成员函数与朋友函数:为什么一个而不是另一个?

时间:2019-04-09 01:23:43

标签: c++ class

为什么通常将对象的函数定义为类成员函数而不是朋友函数(将关联的实例化对象作为参数传递)?

例如,如果将push_back(vector v,val),front(vector v),back(vector)实现为以vector为参数的朋友函数,则不会节省空间,因为这些函数不会节省空间每次创建矢量对象时都必须定义一次,但是只能定义一次?

很抱歉,我的问题没有太大意义。我是编码的新手,对它的术语/术语并不完全满意。如果由于不清楚需要重新表达我的问题,请告诉我。

谢谢:)

2 个答案:

答案 0 :(得分:2)

除非成员函数是虚拟的,否则它们不会占用类内的任何空间。虚拟成员函数仅占用恒定空间。通常为8个字节,与类具有多少个虚函数无关。这是因为具有虚函数的类包含指向vtable的指针,该vtable在运行时查找实际函数。

话虽这么说,在名称空间范围内具有朋友功能非常有用,因为它允许您创建重载集。重载集只是特定函数名称的所有重载的名称。例如,std::to_string是一个重载集,因为有多个具有该名称的函数。

重载集是一个非常有用的概念,因为重载集使您可以编写通用代码,即使这些类型完全不相关,它们也可以作用于许多不同的类型,例如,std::vectorstd::list don不能相互继承或从基类继承,但是编写可在其中任何一个上使用的模板化函数很容易,因为它们在使用方式方面共享一个公共接口。

答案 1 :(得分:1)

  

例如,如果将push_back(vector v,val),front(vector v),back(vector)实现为以vector为参数的朋友函数,则不会节省空间,因为这些函数不会节省空间每次创建矢量对象时都必须定义一次,但是只能定义一次?

函数不是“每次创建矢量对象时都定义”。您不能通过使用类似的朋友功能来节省空间。

成员函数的优点主要围绕继承。成员函数可以具有受保护的访问,也可以是虚拟的等。

Friend函数在实现对称二进制(即,两个参数,对this进行计数)中很有用。作为成员函数,第一个参数将是特殊的,不能被平等对待。此外,好友函数可以提供与C兼容的API,这对于跨语言编程和共享库很有用。