程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++中的成員拜訪運算符和指針到成員運算符

詳解C++中的成員拜訪運算符和指針到成員運算符

編輯:關於C++

詳解C++中的成員拜訪運算符和指針到成員運算符。本站提示廣大學習愛好者:(詳解C++中的成員拜訪運算符和指針到成員運算符)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++中的成員拜訪運算符和指針到成員運算符正文


成員拜訪運算符:. 和 ->

語法

      postfix-expression
      . name
postfix-expression –> name
備注
成員拜訪運算符 . 和 -> 用來援用構造、結合和類的成員。成員拜訪表達式具有選定成員的值和類型。
有兩種情勢的成員拜訪表達式:
在第一種情勢中,postfix-expression 表現構造、類或結合類型的值,name 為指定的構造、結合或類的成員定名。運算的值是 name 的值且為左值(假如 postfix-expression 是左值)。
在第二種情勢中,postfix-expression 表現指向構造、結合或類的指針,name 為指定的構造、結合或類的成員定名。該值是 name 的值且是左值。 –> 運算符撤消援用該指針。是以,表達式 e–>member 和 (*e).member(個中,e 表現指針)會發生雷同的成果(重載運算符 –> 或 * 的情形除外)。
以下示例演示成員拜訪運算符的兩種情勢。

// expre_Selection_Operator.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct Date {
  Date(int i, int j, int k) : day(i), month(j), year(k){}
  int month;
  int day;
  int year;
};

int main() {
  Date mydate(1,1,1900);
  mydate.month = 2;  
  cout << mydate.month << "/" << mydate.day
     << "/" << mydate.year << endl;

  Date *mydate2 = new Date(1,1,2000);
  mydate2->month = 2;
  cout << mydate2->month << "/" << mydate2->day
     << "/" << mydate2->year << endl;
  delete mydate2;
}

如許的話出來的兩個值分離為:

2/1/1900
2/1/2000

指針到成員運算符:.* 和 ->*

 
語法

      expression .* expression
expression –>* expression
備注
指向成員的指針運算符(.* 和 –>*)前往表達式左邊上指定的對象的特定類成員的值。右邊必需指定該類的成員。上面的示例演示若何應用這些運算符:

// 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;
}
Output
m_func1
m_func1

成果分離為:

1
2

在後面的示例中,指向成員的指針 pmfn 用於挪用成員函數 m_func1。另外一個指向成員的指針 pmd 用於拜訪 m_num 成員。
二元運算符 .* 將其第一操作數(必需是類類型的對象)與其第二操作數(必需是指向成員的指針類型)組合在一路。
二元運算符 –>* 將其第一操作數(必需是指向類類型的對象的指針)與其第二操作數(必需是指向成員的指針類型)組合在一路。
在包括 .* 運算符的表達式中,第一操作數必需是類類型且可拜訪,而指向第二操作數中指定的成員的指針或可拜訪類型的成員的指針明白從該類派生而且可供該類拜訪。
在包括 –>* 運算符的表達方法中,第一操作數必需是第二操作數中指定的類型的“指向類類型的指針”或明白地從該類派生的類型。
斟酌以下類和法式段:

// 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.
}

指向成員的指針運算符 .* 或 –>* 的成果是在指向成員的指針的聲明中指定的類型的對象或函數。是以,在後面的示例中,表達式 ADerived.*pmfnFunc1() 的成果是指向前往 void 的函數的指針。假如第二操作數是左值,則此成果為左值。
System_CAPS_note留意
假如某個指向成員的指針運算符的成果是函數,則該成果只能用作函數挪用運算符的操作數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved