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();