非静态成员函数

类可以具有非静态成员函数 ,这些函数在类的各个实例上运行。

class CL {
  public:
    void member_function() {}
};

这些函数在类的实例上调用,如下所示:

CL instance;
instance.member_function();

它们可以在类定义的内部或外部定义; 如果在外部定义,则将它们指定为在类的范围内。

struct ST {
    void  defined_inside() {}
    void defined_outside();
};
void ST::defined_outside() {}

它们可以是 CV 合格和/或 ref-qualified ,影响他们如何看待他们被调用的实例; 该函数将看到实例具有指定的 cv-qualifier(如果有)。调用哪个版本将基于实例的 cv 限定符。如果没有与实例具有相同 cv 限定符的版本,则将调用更多 cv 限定版本(如果可用)。

struct CVQualifiers {
    void func()                   {} // 1: Instance is non-cv-qualified.
    void func() const             {} // 2: Instance is const.

    void cv_only() const volatile {}
};

CVQualifiers       non_cv_instance;
const CVQualifiers      c_instance;

non_cv_instance.func(); // Calls #1.
c_instance.func();      // Calls #2.

non_cv_instance.cv_only(); // Calls const volatile version.
c_instance.cv_only();      // Calls const volatile version.

Version >= C++ 11

成员函数 ref-qualifiers 指示是否要在 rvalue 实例上调用该函数,并使用与函数 cv-qualifiers 相同的语法。

struct RefQualifiers {
    void func() &  {} // 1: Called on normal instances.
    void func() && {} // 2: Called on rvalue (temporary) instances.
};

RefQualifiers rf;
rf.func();              // Calls #1.
RefQualifiers{}.func(); // Calls #2.

如有必要,还可以组合 CV 限定符和 ref 限定符。

struct BothCVAndRef {
    void func() const& {} // Called on normal instances.  Sees instance as const.
    void func() &&     {} // Called on temporary instances.
};

它们也可以是虚拟的 ; 这是多态性的基础,并允许子类提供与父类相同的接口,同时提供它们自己的功能。

struct Base {
    virtual void func() {}
};
struct Derived {
    virtual void func() {}
};

Base* bp = new Base;
Base* dp = new Derived;
bp.func(); // Calls Base::func().
dp.func(); // Calls Derived::func().

有关更多信息,请参阅此处