普通成员函数和静态成员函数的区别

成员函数(也称为非静态成员函数)和静态成员函数之间有一些关键的区别:

关联对象:

  • 成员函数:每个成员函数在调用时都会关联到一个特定的对象实例。在成员函数内部,可以使用this指针来访问对象的成员变量。obj.func()这种调用可以理解为:myClass::func(&obj)
  • 静态成员函数:静态成员函数不与特定的对象实例关联。它们没有隐含的this指针,因此无法直接访问静态成员变量。静态成员函数的调用方式更类似于普通函数调用,而不需要通过对象来调用。

访问权限:

  • 成员函数:可以访问类中的所有成员,包括私有成员。
  • 静态成员函数:可以访问类的静态成员(包括静态变量和静态函数),但不能直接访问非静态成员,因为它们没有关联的对象实例。

调用方式:

  • 成员函数:需要通过对象来调用,使用成员运算符 . ->。成员函数调用时会自动传递调用对象给this指针。
  • 静态成员函数:可以通过类名直接调用,也可以通过对象调用。但无论哪种方式,静态成员函数都不会自动接收 this 指针,因为它们没有对象关联。

存储方式:

  • 成员函数:每个对象实例并不存储成员函数的代码,只存储成员变量。成员函数的代码只有一份,存储在可执行代码段中。
  • 静态成员函数:同样地,静态成员函数的代码只有一份,存储在可执行代码段中。静态成员变量也只有一份,存储在全局数据区域。

调用约定:

  • 成员函数:因为成员函数关联到对象实例,调用时会在运行时动态解析正确的函数。这可能会带来轻微的运行时开销。
  • 静态成员函数:由于它们不与对象实例关联,调用静态成员函数没有对象查找开销,更类似于普通函数调用。

总之,成员函数主要用于操作对象实例的状态,而静态成员函数则更像是与类本身相关的功能函数。静态成员函数不依赖于对象实例,因此它们在某些情况下更具有通用性和效率。

你可能感兴趣的:(C++,c++)