c++;:成员函数和非成员函数之间的区别 < C++中成员与非成员函数的区别是什么?< p>非它的代码>静态< /COD>成员函数在它所属的类的对象上被调用。它可以隐式访问表示当前对象的指针。通过此指针,它可以轻松访问其他成员,并具有完全访问权限(即访问private成员)

c++;:成员函数和非成员函数之间的区别 < C++中成员与非成员函数的区别是什么?< p>非它的代码>静态< /COD>成员函数在它所属的类的对象上被调用。它可以隐式访问表示当前对象的指针。通过此指针,它可以轻松访问其他成员,并具有完全访问权限(即访问private成员),c++,oop,C++,Oop,非成员函数没有隐式this。在下面的示例中,bar是一个成员函数,而freebar不是。两者的作用大致相同,但请注意bar如何通过this获取隐式对象指针(也只有bar有权访问foo的成员,freebar只有权访问公共成员) 从语义上讲,成员函数不仅仅是带有隐式this参数的函数。它旨在定义对象的行为(即汽车对象将drive(),stop()作为成员函数) 请注意,也有静态成员函数具有完全权限,但不获取隐式的this,也不通过类的实例(而是通过类的全名)调用它们。成员函数在实例上被调用,并且具有

非成员函数没有隐式
this
。在下面的示例中,
bar
是一个成员函数,而
freebar
不是。两者的作用大致相同,但请注意
bar
如何通过
this
获取隐式对象指针(也只有
bar
有权访问
foo
的成员,
freebar
只有权访问公共成员)

从语义上讲,成员函数不仅仅是带有隐式this参数的函数。它旨在定义对象的行为(即汽车对象将
drive()
stop()
作为成员函数)


请注意,也有
静态
成员函数具有完全权限,但不获取隐式的
this
,也不通过类的实例(而是通过类的全名)调用它们。

成员函数在实例上被调用,并且具有可用的
this
指针;非成员不需要。

成员函数在对象上被调用,并且可以访问类的字段

成员函数可以是多态的(通过
virtual
关键字),这对于OOP是必不可少的。

一个(非静态)成员函数有一个隐式
参数,而非成员函数没有

从语法上讲,传递
->
运算符
like.so()
like->so()
左侧的隐式参数,而不是作为函数参数
so(like)

同样,在声明成员函数时,需要在该函数所属的类中声明:

class Class {
public:
    void a_public_member_function();
};
非成员函数在任何类之外声明(C++称之为“在命名空间范围”)


(非静态)成员函数也可以是虚拟的,但非成员函数(和静态成员函数)不能。

在以下代码中,
f()
是类
Sample
的成员函数,
g()
是非成员函数:

class Sample
{
  void f();
};

void g();

这很简单。由于
f()
是类
Sample
的成员,因此它被称为成员函数(类
Sample
)。因为
g()
不是任何类的成员,所以它被称为非成员函数。

成员函数(我现在调用方法)和自由函数(我现在调用函数)之间有一些区别

首先,让我们声明它们并没有太大的不同。目标代码通常可以编译成C(或汇编),这是一种没有方法概念的过程语言。然后,方法和函数都像子例程一样被调用

现在,这已经不重要了,让我们看看它们的区别。它们可以分为两类:概念和句法

语法上

语法是任何语言中显而易见的一部分,因此它是最容易避开的

第一个注释:C++中有两种不同的方法(以及许多其他语言),<代码>静态< /COD>方法和常规方法。 这两种方法都可以完全访问类内部(
protected
private
部分)以及(当然)访问类
public
接口

static
方法等同于
friend
函数(除了一些作用域差异)

在常规方法中,一个特殊关键字(
C++中的this
)允许访问调用该方法的当前对象(通过
->
*
->*
运算符)

常规方法可以是
const
和/或
volatile
限定,分别为
const
和/或
volatile
限定对象启用。例如,不能对
const
对象调用非
const
方法。这可以被视为在方法中限定
This
,即
void Foo::bar()const
具有
This
类型的
Foo const*

常规方法可以标记为
virtual
。虚拟性通过启用覆盖来启用运行时多态性。我不会在这里扩展这个机制,让我们注意函数不能是虚拟的

一个经常被忽略的点是,方法(静态方法和常规方法)的作用域都在类中。这对于名称查找(其他方法或属性/变量)非常重要,因为这意味着在从方法查找类外声明的元素时,类的元素具有优先级

由于在属性或方法之前使用
this->
的限定不是强制性的,这在常规方法中很方便,尽管它可能会引入一些微妙的错误。在静态方法中,它避免了通过类名限定要访问的静态属性和方法

既然已经断言了主要的语法差异,那么让我们检查一下概念差异

概念上

OOP通常是关于将状态和行为(此状态)联系在一起。这是通过创建类来完成的,这些类对属性(状态)和行为(方法)进行分组,并且(理论上)声明只有方法才能作用于状态。因此,在OOP中,方法负责实现类的行为

这些方法参与了状态的封装(将客户机从实现细节中解放出来)和保存
class Sample
{
  void f();
};

void g();