欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++指向類成員函數(shù)的指針詳細(xì)解析

 更新時(shí)間:2013年08月20日 09:14:40   作者:  
由于這幾天在開(kāi)發(fā)中要用到函數(shù)指針,所以就整理了一下關(guān)于函數(shù)指針的概念

首先 函數(shù)指針是指向一組同類型的函數(shù)的指針;而類成員函數(shù)我們也可以相似的認(rèn)為,它是指向同類中同一組類型的成員函數(shù)的指針,當(dāng)然這里的成員函數(shù)更準(zhǔn)確的講應(yīng)該是指非靜態(tài)的成員函數(shù)。前者是直接指向函數(shù)地址的,而后者我們從字面上也可以知道 它肯定是跟類和對(duì)象有著關(guān)系的。

函數(shù)指針實(shí)例:

復(fù)制代碼 代碼如下:

typedef int (*p)(int,int);//定義一個(gè)接受兩個(gè)int型且返回int型變量的函數(shù)指針類型
int func(int x,int y)
{
 printf("func:x=%d,y=%d/n",x,y);
 return (x<y?x:y);
}
int main()
{
 p fun=func;//定義函數(shù)指針并給它賦上一個(gè)函數(shù)指針
 cout<<"min:"<<(*fun)(4,5)<<endl;//為什么*fun需要用()擴(kuò)起來(lái)呢?因?yàn)?的運(yùn)算符優(yōu)先級(jí)比()低,如果不用()就成了*(fun())
 return 0;
}
   而“指向類成員函數(shù)的指針”卻多了一個(gè)類的區(qū)別:
class A
{
public:
 int func(int x,int y)
 {
  printf("A::func:x=%d,y=%d/n",x,y);
  return (x<y?x:y);
 }
};
typedef int (A::*p)(int,int);//指針名前一定要加上所屬類型類名 A::的限定
int main()
{
 p fun=&A::func;
 A a;                  //因?yàn)槌蓡T函數(shù)地址的解引用必須要附駐與某個(gè)對(duì)象的地址,所以我們必須創(chuàng)建某個(gè)對(duì)象。
 cout<<"min:"<<(a.*fun)(4,5)<<endl;
 return 0;
}

嘿嘿。。只是用起來(lái) .*  感覺(jué)怪怪滴。

接下來(lái) 我們可以再擴(kuò)展一下下:
復(fù)制代碼 代碼如下:

#include <tchar.h>
#include <iostream>
#include <stdio.h>
using namespace std;
class A
{
public:
 int func1(int x,int y)
 {
  printf("A::func:x=%d,y=%d/n",x,y);
  return (x<y?x:y);
 }
 virtual int func2(int x,int y)
 {
  printf("A::func:x=%d,y=%d/n",x,y);
  return (x>y?x:y);
 }
};
class B:public A
{
public:
 virtual int func2(int x,int y)
 {
  printf("B::func:x=%d,y=%d/n",x,y);
  return (x+y);
 }
};
typedef int (A::*p)(int,int);//指針名前一定要加上所屬類型類名 A::的限定
typedef int (B::*p0)(int,int);
int main()
{
 A a;                   //因?yàn)槌蓡T函數(shù)地址的解引用必須要附駐與某個(gè)對(duì)象的地址,所以我們必須創(chuàng)建某個(gè)對(duì)象。

 p fun=&A::func1;
 cout<<(a.*fun)(4,5)<<endl;
 cout<<(b.*fun)(4,5)<<endl<<endl;
 fun=&A::func2;
 cout<<(a.*fun)(4,5)<<endl;//請(qǐng)注意這里調(diào)用的是虛函數(shù),嘿嘿 還真神奇 類成員函數(shù)指針也支持多態(tài)。
 cout<<(b.*fun)(4,5)<<endl<<endl;
 //fun=&B::func2;         //這樣式錯(cuò)誤滴,因?yàn)椴淮嬖谂缮惖?指向類成員函數(shù)的指針"到基類的"指向類成員函數(shù)的指針"的隱式轉(zhuǎn)換
 fun=(int (A::*)(int,int))&B::func2;//應(yīng)該進(jìn)行強(qiáng)制轉(zhuǎn)換
 cout<<(a.*fun)(4,5)<<endl;
 cout<<(b.*fun)(4,5)<<endl<<endl;

 p0 fun0=&B::func2;
 cout<<(a.*fun)(4,5)<<endl;
 cout<<(b.*fun)(4,5)<<endl<<endl;

 fun0=&A::func2;           //正確,因?yàn)檫@里進(jìn)行了隱式轉(zhuǎn)換
 cout<<(a.*fun)(4,5)<<endl;
 cout<<(b.*fun)(4,5)<<endl<<endl;
 //從上面我們不難發(fā)現(xiàn) 指向類成員函數(shù)的指針基類和派生類的關(guān)系和指向類對(duì)象的指針基類和派生類的關(guān)系完全相反,
 //基類成員函數(shù)的布局被認(rèn)為是派生類成員函數(shù)布局的一個(gè)子集
 return 0;
}

接下  是有關(guān)模板類的類成員函數(shù)指針的使用
實(shí)例如下:
復(fù)制代碼 代碼如下:

#include <tchar.h>
#include <iostream>
#include <stdio.h>
using namespace std;
class A
{
public:
 int func(int x,int y)
 {
  printf("A::func : x=%d,y=%d/n",x,y);
  return (x<y?x:y);
 }
};
class B
{
public:
 int func(int x,int y)
 {
  printf("B::func : x=%d,y=%d/n",x,y);
  return (x>y?x:y);
 }
};
template<class T>
class C
{
public:
 T c;
 void Print()
 {
  int (T::*p)(int,int)=&T::func;
  (c.*p)(4,5);
 }
};
int main()
{
 C<A> ca;
 C<B> cb;
 ca.Print();
 cb.Print();
 return 0;
}

從上面 可以很清晰地看到。。其實(shí)它和普通的模板沒(méi)有什么區(qū)別。。只不過(guò)將限定名稱該為參數(shù)名酒OK啦。。。
嘿嘿。。。

相關(guān)文章

  • C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸

    C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸

    這篇文章主要為大家介紹了C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)遞歸,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(75.顏色排序)

    C++實(shí)現(xiàn)LeetCode(75.顏色排序)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(75.顏色排序),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++基礎(chǔ)算法基于哈希表的索引堆變形

    C++基礎(chǔ)算法基于哈希表的索引堆變形

    這篇文章主要為大家介紹了C++基礎(chǔ)算法,基于哈希表的索引堆變形示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • C語(yǔ)言中的strlen()和sizeof()對(duì)比分析

    C語(yǔ)言中的strlen()和sizeof()對(duì)比分析

    這篇文章主要介紹了C語(yǔ)言中的strlen()和sizeof()區(qū)別對(duì)比,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法

    C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法

    今天小編就為大家分享一篇C++ 將一個(gè)文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • C++臨時(shí)性對(duì)象的生命周期詳細(xì)解析

    C++臨時(shí)性對(duì)象的生命周期詳細(xì)解析

    臨時(shí)性對(duì)象的被摧毀,應(yīng)該是對(duì)完整表達(dá)式(full-expression)求值過(guò)程中的最后一個(gè)步驟。該完整表達(dá)式造成臨時(shí)對(duì)象的產(chǎn)生
    2013-09-09
  • 深入理解C++函數(shù)棧幀

    深入理解C++函數(shù)棧幀

    本文主要介紹了C++函數(shù)棧幀,詳細(xì)的介紹了C++函數(shù)棧幀的概念以及使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語(yǔ)言基礎(chǔ)之格式化輸出控制長(zhǎng)度

    C語(yǔ)言基礎(chǔ)之格式化輸出控制長(zhǎng)度

    這篇文章主要介紹了C語(yǔ)言基礎(chǔ)之格式化輸出控制長(zhǎng)度的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決

    C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決

    這篇文章主要介紹了C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Qt開(kāi)發(fā)之獲取電腦磁盤(pán)容量

    Qt開(kāi)發(fā)之獲取電腦磁盤(pán)容量

    項(xiàng)目中用到了監(jiān)測(cè)某磁盤(pán)(如:C盤(pán)、D盤(pán)等)的總?cè)萘亢涂捎萌萘?,查了一下,發(fā)現(xiàn)其實(shí)挺簡(jiǎn)單,本文就來(lái)用QT實(shí)現(xiàn)這一功能吧,希望對(duì)大家有所幫助
    2023-04-04

最新評(píng)論