亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2016年01月12日 16:05:30   投稿:goldensun  
這篇文章主要介紹了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注意
如果某個指向成員的指針運算符的結果是函數,則該結果只能用作函數調用運算符的操作數。

您可能感興趣的文章:

相關文章

  • C語言運算符的優(yōu)先級和結合性實例詳解

    C語言運算符的優(yōu)先級和結合性實例詳解

    本文主要介紹C語言運算符的知識,這里對運算符的優(yōu)先級和結合性做出了詳解,并附實例代碼,希望能幫助有需要的小伙伴
    2016-07-07
  • 淺析c#中如何在form的webbrowser控件中獲得鼠標坐標

    淺析c#中如何在form的webbrowser控件中獲得鼠標坐標

    以下是對c#中如何在form的webbrowser控件中獲得鼠標坐標的實現方法進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C/C++中一次性執(zhí)行多個DOS命令的實現思路

    C/C++中一次性執(zhí)行多個DOS命令的實現思路

    在C語言中執(zhí)行DOS命令的方法很多,在這就不一給大家一一介紹了,本文重點給大家介紹C/C++中一次性執(zhí)行多個DOS命令的實現思路,需要的朋友參考下
    2017-12-12
  • C++中hashmap的一些使用建議

    C++中hashmap的一些使用建議

    由于hashmap不是c++ stl中標準實現,這樣在跨平臺使用時就可能會出現問題,下面這篇文章主要給大家介紹了關于C++中hashmap的一些使用建議,需要的朋友可以參考下
    2023-03-03
  • C++簡單集合類的實現方法

    C++簡單集合類的實現方法

    如何使用C++實現一個簡單的集合類,這篇文章主要介紹了C++簡單集合類的實現方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 學習C和C++的9點經驗總結

    學習C和C++的9點經驗總結

    本文給大家總結了一下我們在學習C和C++的時候的一些經驗和需要注意的事項,希望能給大家一些幫助,少走些彎路
    2015-12-12
  • OpenCV使用BSM統計視頻中移動的對象

    OpenCV使用BSM統計視頻中移動的對象

    這篇文章主要為大家詳細介紹了OpenCV如何使用BackgroundSubstractor(BSM)實現視頻中移動對象統計功能,文中的示例代碼講解詳細,需要的可以參考一下
    2023-02-02
  • 線程按指定順序輸出字符到數組的實例代碼

    線程按指定順序輸出字符到數組的實例代碼

    這篇文章主要介紹了線程按指定順序輸出字符到數組的實例代碼,需要的朋友可以參考下
    2014-02-02
  • 詳解C++ thread用法總結

    詳解C++ thread用法總結

    這篇文章主要介紹了詳解C++ thread用法總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 為什么說C語言是永不過時的語言

    為什么說C語言是永不過時的語言

    時隔5年,C語言再次領先Java,榮登TIOBE編程語言排行榜第一,那么C語言為何不會過時?你需要掌握多少種語言呢,感興趣的朋友通過本文一起學習下吧
    2020-11-11

最新評論