非靜態成員函式

類可以具有非靜態成員函式 ,這些函式在類的各個例項上執行。

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

有關更多資訊,請參閱此處