国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C++中的指針用法匯集

發布時間:2011-4-20 21:51    發布者:1046235000
關鍵詞: 指針
在C++中,指針用得比較多,對于里面眾多的指針用法,不免弄得有些糊涂,自從我從圖書館里借到一本譚浩強教授主編的《C++面向對象程序設計》后,才幫我理清了思路。現把部分內容展現給大家,希望對大家有所幫助。
    C++程序設計重要基礎就是類和對象,對象指針是很重要的一部分,包括指向對象的指針、指向對象成員的指針、this指針、指向對象的常指針、指向常對象的指針等。
    1、指向對象的指針
    定義:對象空間的起始地址就是對象的指針。
    說明:在建立對象時,編譯系統就為每個對象分配一定的存儲空間以存放其成員,不過注意,在一般情況下不同對象的數據存儲單元中存放的數據成員是不相同,而不同對象的函數代碼卻是相同的,也就是說,它們的函數代碼是共享的。這時我們可以定義一個指針變量用來存放對象的指針。
    定義指向類對象的指針變量的一般形式是:
    類名 *對象指針名;
    如對于與個Time類對象,我們可以有:
    Time t;
    Time *p;
    p=&t;
    我們就可以通過對象指針訪問對象和對象的成員,假如所定義的類中有數據成員hour、minute、sec,成員函數有gettime(),則
    (*p).hour  即為p指向對象中的hour成員,相當于t.hour
    (*p).gettime()  即為p指向對象中的成員函數gettime(),相當于t.gettime()
    也可以用如下形式:
    p->hour 和 p->gettime()和上面是等價的。
    2、指向對象成員的指針
    (1)指向對象數據成員的指針
    在C中我們學過指向普通變量的指針變量,在C++中定義指向對象數據成員的指針變量的方法和定義指向普通變量的指針變量方法相同,其一般形式為:
    數據類型名 *指針變量名;
    如:
    int *p;
    p=&t.hour;   //將對象t的數據成員hour的地址賦給p,p指向t.hour
    (2)指向對象成員函數的指針
    定義指向對象成員函數的指針變量和定義指向普通函數的指針變量不同。
    在定義指向普通函數的指針變量時我們可以這樣定義:
    void (*p)();
    p=fun;
    (*p)();   //調用fun函數
    然而編譯系統要求在將函數地址賦給指針變量時必須滿足三個條件:
    函數參數類型及個數要匹配
    函數返回值的類型要匹配
    所屬的類要匹配
    顯然在上面的p與類是無關的。為了滿足第三條,我們可以為指針指定類,故定義指向對象成員函數的指針變量一般形式為:
    數據類型(類名::*指針變量名)(參數表列);
    可以讓指針指向公用的成員函數,如:
    void (Time::*p)();  //定義指向Time類對象成員函數的指針變量p
    p=&Time::gettime;   //把Time類的公用成員函數gettime()地址賦給指針變量p
    (t.*p)();           //調用Time類對象t的成員函數gettime()
    注意:因為成員函數不存放在對象空間中,多個同類對象共享此成員函數代碼,所以在將成員函數的入口地址賦給指針變量是應寫成:
    指向對象成員函數的指針變量=&類名::成員函數名;
    在成員函數名后面沒有"()",如果寫成p=&Time::gettime()是錯誤的。[nextp
    3、this指針
    在每個成員函數中都包含了一個特殊的指針,稱為this,它是指向本類對象的指針,它的值是當前被調用成員函數所在對象的起始地址。之所以有這個指針,是因為為了保證同類的不同對象的成員函數引用的是指定對象中的數據成員,它是系統自動實現的。
    如定義一個求體積的函數
    int box::vol()
    {return(height*width*length);}
    假如已經定義了對象t,當調用成員函數t.vol()時,編譯系統就把對象t的起始地址賦給this指針,于是在成員函數引用數據成員時,根據指針this就可以引用到對象t的數據成員。所以C++把上面的函數處理成
    int box::vol()
    {return(this->height*this->width*this->length);}
    由于this的值是當前被調用成員函數所在對象的起始地址,所以可以寫成
    int box::vol()
    {return((*this).height*(*this).width*(*this).length);}
    所以在調用成員函數t.vlo()時,實際的調用方式為t.vol(&t),不過對象t的地址傳給this指針是由系統自動完成的,不需人為加上。
    4、指向對象的常指針
    將指向對象的指針變量聲明為const型且進行處始化,這樣指針值始終保持為其初值,不能改變其指向。
    如:
    Time t1(8,8,8),t2;
    Time *const p=&t1;   //常指針p指向對象t1
    p=&t2;               //試圖改變p的指向,非法
    由上面我們可以看出定義指向對象的常指針的一般形式為:
    類名 *const 指針變量名=對象的起始地址;
    注意:指向對象的常指針變量的值不能改變,但可以改變它所指向對象中的數據成員的值。
    常指針一般用作函數的參數,這樣就不允許在函數執行過程中改變指針變量的值,使其始終保持指向原來的對象。
    5、指向常對象的指針變量
    首先回顧一下指向常變量的指針變量,其一般形式為:
    const 類型名 *指針變量名;
    如:
    const char *p;
    如果一個變量已經被聲明為常變量,那么只能用指向常變量的指針變量去指向它,而不能用一般的指針變量。另外,指向常變量的指針變量除了可以指向常變量外,還可以指向未被聲明為const的變量,但也不能通過該指針改變其值。例如:
    char c='a'              //定義字符變量c,未聲名為const
    const char *p;          //定義指向常變量的指針變量p
    p=&c;                   //p指向字符變量c
    *p='b';                 //非法
    c='b';                  //合法
    說明:上例中,指針變量p指向字符變量c,并不說把c也聲明成常變量,而只是說在通過指針變量引用c時,c具有常變量的特征,其值是不能改變的,但c仍然是一個普通變量。
    在指向常變量的指針中,關于函數形參的指針類型有幾點值得注意:
    如果函數形參是非const型指針變量,實參只能用指向非const型指針;如果函數形參是指向const型變量的指針,實參則可以是const型的或非const型的指針變量。換句話說就是指向常變量的指針可以指向const和非const型的變量,而指向非const型變量的指針只能指向非const的變量。
    用指針變量作形參時形參和實參的對應關系表 形參 實參  合法與否 改變指針所指對象的值  指向非const型變量的指針 非const變量的地址 合法 行 指向非const型變量的指針 const變量的地址 非法 / 指向const型變量的指針 const變量的地址 合法 不行 指向const型變量的指針 非const變量的地址 合法 不行    下面說到正題,指向常對象的指針變量和指向常變量指針變量類似。
    如果一個對象已經被聲明為長對象,只能用指向常對象的指針變量指向它,而不能用一般的指針變量指向它。
    如果定義了一個指向常對象的指針變量且使它指向一個非const的對象,其指向的對象不能通過指針來改變。
    如果定義了一個指向常對象的指針變量,是不能通過它改變所指向的對象的值的,但是指針變量本身的值是可以改變的。
    如:
    Time t1(8,8,8),t2;         //定義對象
    const time *p=&t1;         //定義指向常對象的指針p,并使它指向t1
    p=&t2;                     //合法,指針p指向對象t2
    所以當我們希望在調用函數時對象的值不被修改,我們就可以把形參定義為const型的指針變量,同時用對象的地址作實參(對象可以是const或非const型);當要求對象不僅在調用函數中不被改變,而且在程序執行過程中也不發生改變,我們就把它定義為const型。所以指向常對象的指針最常用于函數的參數,以保護形參指針所指向的對象在函數執行過程中不被修改。
本文地址:http://m.qingdxww.cn/thread-63046-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
sw9518 發表于 2011-4-21 09:20:48
fymbl 發表于 2011-4-22 13:06:53
學習了。。。。。。
ghostbod 發表于 2011-4-24 10:54:55
幫助狠打 多謝
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
  • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
  • 利用模擬開發工具生態系統進行安全電路設計
  • Cortex-M4外設 —— TC&TCC結合事件系統&DMA優化任務培訓教程
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品lululu在线观看 | 97国产成人精品免费视频 | 国产小视频在线免费观看 | 香蕉成人国产精品免费看网站 | 精品在线免费观看 | 黄视频在线免费 | 欧美区国产区 | 日韩专区一区 | 亚洲免费观看 | 免费看黄视频网站 | 国产成人手机视频 | 含羞草app| 97国产成人精品免费视频 | 国内精品91 | 亚洲欧美一区二区三区另类 | 国产成人亚洲精品无广告 | 草逼视频免费看 | 噜噜噜在线 | 亚洲一区 在线播放 | 成人免费一级在线播放 | 天天噜日日噜夜夜噜 | 国产吧在线 | 欧美一区二区三区日韩免费播 | 成人免费在线视频 | 欧美成人免费网在线观看 | 日韩欧美亚洲国产一区二区三区 | 亚洲第一福利视频 | 国产入口在线观看 | 欧美性色欧美a在线观看 | 九九视频国产 | 国产精品综合视频 | 中文字幕手机在线视频 | 力王国语在线观看完整国语版免费 | 高清欧美在线三级视频 | 99久久精品国产片 | 欧美片在线观看 | 黄色一级毛片 | 国产日韩第一页 | 国产在线精品一区二区高清不卡 | 中文在线天堂网 | 日产精品卡二卡三卡四卡乱码视频 |