Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Üyeye işaretçi işleçleri:
Sözdizimi
pm-expression:
cast-expression
pm-expression
.*
cast-expression
pm-expression
->*
cast-expression
Açıklamalar
İşaretçiden üyeye işleçleri .* ve ->* ifadenin sol tarafında belirtilen nesne için belirli bir sınıf üyesinin değerini döndürür. Sağ tarafta sınıfın bir üyesi belirtilmelidir. Aşağıdaki örnekte bu işleçlerin nasıl kullanılacağı gösterilmektedir:
// expre_Expressions_with_Pointer_Member_Operators.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Testpm {
public:
void m_func1() { cout << "m_func1\n"; }
int m_num;
};
// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and
// m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;
int main() {
Testpm ATestpm;
Testpm *pTestpm = new Testpm;
// Access the member function
(ATestpm.*pmfn)();
(pTestpm->*pmfn)(); // Parentheses required since * binds
// less tightly than the function call.
// Access the member data
ATestpm.*pmd = 1;
pTestpm->*pmd = 2;
cout << ATestpm.*pmd << endl
<< pTestpm->*pmd << endl;
delete pTestpm;
}
Çıktı
m_func1
m_func1
1
2
Yukarıdaki örnekte, üye pmfnişlevini m_func1çağırmak için öğesinin işaretçisi kullanılır. Üyeye erişmek için bir üyenin pmdbaşka bir işaretçisi m_num olan kullanılır.
İkili işleç .* , sınıf türünde bir nesne olması gereken ilk işlenenini, işaretçiden üyeye türünde olması gereken ikinci işleneniyle birleştirir.
İkili işleç ->* , sınıf türünde bir nesneye işaretçi olması gereken ilk işlenenini, işaretçiden üyeye türünde olması gereken ikinci işleneniyle birleştirir.
işlecini .* içeren bir ifadede, birinci işlenen, ikinci işlenende belirtilen üye işaretçisinin veya bu sınıftan kesin bir şekilde türetilmiş ve erişilebilir olan erişilebilir bir türün sınıf türünde olması ve buna erişilebilir olması gerekir.
işlecini ->* içeren bir ifadede, ilk işlenen ikinci işlenende belirtilen türün "sınıf türü işaretçisi" türünde olmalıdır veya bu sınıftan kesin olarak türetilmiş bir tür olmalıdır.
Örnek
Aşağıdaki sınıfları ve program parçasını göz önünde bulundurun:
// expre_Expressions_with_Pointer_Member_Operators2.cpp
// C2440 expected
class BaseClass {
public:
BaseClass(); // Base class constructor.
void Func1();
};
// Declare a pointer to member function Func1.
void (BaseClass::*pmfnFunc1)() = &BaseClass::Func1;
class Derived : public BaseClass {
public:
Derived(); // Derived class constructor.
void Func2();
};
// Declare a pointer to member function Func2.
void (Derived::*pmfnFunc2)() = &Derived::Func2;
int main() {
BaseClass ABase;
Derived ADerived;
(ABase.*pmfnFunc1)(); // OK: defined for BaseClass.
(ABase.*pmfnFunc2)(); // Error: cannot use base class to
// access pointers to members of
// derived classes.
(ADerived.*pmfnFunc1)(); // OK: Derived is unambiguously
// derived from BaseClass.
(ADerived.*pmfnFunc2)(); // OK: defined for Derived.
}
veya ->* işaretçiden üyeye işleçlerinin .* sonucu, üye işaretçisinin bildiriminde belirtilen türde bir nesne veya işlevdir. Bu nedenle, önceki örnekte ifadenin ADerived.*pmfnFunc1() sonucu döndüren voidbir işlev işaretçisidir. İkinci işlenen bir l değeriyse, bu sonuç bir l değeridir.
Uyarı
İşaretçiden üyeye işleçlerden birinin sonucu bir işlevse, sonuç yalnızca işlev çağrısı işlecinin işleneni olarak kullanılabilir.
Ayrıca bakınız
C++ yerleşik işleçleri, önceliği ve ilişkilendirilebilirliği