青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

聚星亭

吾笨笨且懶散兮 急須改之而奮進(jìn)
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

 

       本來(lái)這一講是打算講指針的,可是考慮到C++中指針的更多操作,我不想講一個(gè)問(wèn)題分成兩部分,因此,我就先講C++的部分,等需要用到指針的時(shí)候,我們專門寫(xiě)一個(gè)專題講述指針部分。    好進(jìn)入正題。

 

       大家都知道,C++是在C的基礎(chǔ)上擴(kuò)展了好多東西,其中好多是思想上的轉(zhuǎn)變,因此,很多C++中的東西,我們都可以用C語(yǔ)言來(lái)模擬出來(lái),比如構(gòu)造、析構(gòu)等等。       但是也有很多是C++編譯器擴(kuò)展的東西,我們沒(méi)有辦法用C去模擬,因此,我寫(xiě)了這個(gè)小節(jié),重在理解……

 

       C++中,零散的知識(shí)點(diǎn)比較多,因此,我每個(gè)專題盡量減少其內(nèi)容,而增加更新頻率,希望大家能有助于大家的理解。

 

              一、宏定義的擴(kuò)展——constinline

#define 宏定義,是C的知識(shí)范疇,由于全都都語(yǔ)法范疇且又僅僅是簡(jiǎn)單的查找替換因此我沒(méi)有為它單獨(dú)的列一個(gè)專題,大家可以自己學(xué)習(xí)一下。我想如果要講這個(gè)內(nèi)容,也得等我們課程進(jìn)行到MFC或者WTL的時(shí)候再捎帶提一下。

 

學(xué)習(xí)過(guò)#define 以后,我們知道,它一般用來(lái)定義常量,由于它可以帶參數(shù),且因沒(méi)有函數(shù)調(diào)用時(shí)傳參的復(fù)雜過(guò)程而速度快的優(yōu)點(diǎn),因此它經(jīng)常被當(dāng)作“函數(shù)”使用。

 

但是#define也是有缺點(diǎn)的,比如它定義的常量沒(méi)有類型信息,它定義的“函數(shù)”(帶參宏)不安全等原因,C++對(duì)這個(gè)功能進(jìn)行了擴(kuò)充,分別用constinline兩個(gè)關(guān)鍵字來(lái)分別代替無(wú)參宏定義常量,帶參宏定義函數(shù)。下面分別看一下它們的用法及原理。

1.         const 的用法。

const用于定義常量,基礎(chǔ)語(yǔ)法如下:

const      類型             常量名

類型       const            常量名

 

關(guān)于const的基礎(chǔ)語(yǔ)法:const 只是對(duì)除類型外,緊靠其右邊的元素。

                     比如:

// 這時(shí)const右面除了類型就是nCountNum變量,所以,nCountNum的內(nèi)容不可以改變。

const int nCountNum = 5;

 

// const右邊是*,在指針中*表示內(nèi)容,所以pnCountNum指針指向的變量?jī)?nèi)容不可以被改變。

const int *pnCountNum = nCountNum;

 

// const右邊還是*,所以同上

int  const  *pnCountNum = nCountNum;

 

// const右邊是指針變量名,指針變量代表地址,所以pnCountNum中的內(nèi)容不可以被改變。

int  *  const  pnCountNum = nCountNum;

 

OK,知道了以上的語(yǔ)法知識(shí),我們需要了解,這種常量跟我們用宏定義的常量是有區(qū)別的,因?yàn)檫@個(gè)是編譯器級(jí)別的常量,我們可以通過(guò)指針來(lái)修改它的內(nèi)容,當(dāng)然,若在代碼中使用const變量,則直接在代碼中使用其常量值,如下面的代碼:

    const int nCount = 50;

 

    int tmpNum = 0;

    scanf("%d", &tmpNum);  // 防止編譯器自動(dòng)優(yōu)化代碼

 

    printf("%d", tmpNum + nCount);

// 26:       printf("%d", tmpNum + nCount);

//             0040D427   mov         ecx,dword ptr [ebp-8]

//             0040D42A   add         ecx,32h                // 直接當(dāng)作常量使用

//             0040D42D   push        ecx

//             0040D42E   push        offset string "%d" (0042201c)

//             0040D433   call        printf (0040f900)

 

通過(guò)上面的代碼,我們可以知道,nCount這個(gè)常量有自己的棧地址,只要有地址,我們肯定是可以用指針來(lái)修改它內(nèi)容的。

                    

                     但是,通過(guò)

//             0040D42A   add         ecx,32h                // 直接當(dāng)作常量使用

這一句,我們清楚,這個(gè)代碼是直接將nCount 當(dāng)做常量使用,所以即使我們更改了nCount 中的內(nèi)容,這里的值也不會(huì)改變了。

 

2.         inline 的用法。

是的,雖然帶參宏的使用提高了編碼的效率,從一定程度上提高了程序的運(yùn)行效率(因?yàn)樗倭撕瘮?shù)調(diào)用的壓棧出棧等操作)而被MFCWTL等廣泛的應(yīng)用,但是不可否認(rèn)用帶參宏的不安全性,在C++中引入了inline函數(shù)的概念,它用inline函數(shù)來(lái)代替帶參宏的功能。

 

                     到這里,我們就不難理解,inline函數(shù)的特點(diǎn)了:在函數(shù)被調(diào)用的地方將代碼展開(kāi)。比如下面的代碼:

/************************************************************************/

/* C++中用內(nèi)聯(lián)函數(shù)來(lái)代替有參宏,跟有參宏一樣,它在調(diào)用的地方原地展開(kāi)

/* 因此,內(nèi)聯(lián)函數(shù)也同有參宏一樣,在同一個(gè)代碼中存在多份拷貝。

/* 所以,內(nèi)聯(lián)函數(shù)一般聲明在頭文件中就可以了。

 

/* 說(shuō)  :

/*         內(nèi)聯(lián)函數(shù)中不能包含switchwhile等復(fù)雜結(jié)構(gòu),如果邏輯復(fù)雜了編譯器

/*     就將它當(dāng)做普通函數(shù)處理。

/************************************************************************/

inline int add(int a, int b, int c)

{

    return a+b+c;

}

 

int main(int argc, char* argv[])

{

    int a,b,c;

    scanf("%d %d %d", &a, &b, &c);

    printf("%d", add(a,b,c));

       return 0;

}

 

              由于DEBUG方式編譯的程序不做任何優(yōu)化,所以,我們release方式編譯此代碼,得到如下信息:

/*DEBUG 模式下,內(nèi)聯(lián)就是普通函數(shù),release模式下才真正的內(nèi)聯(lián)。*/

 

// 00401000 >/$  83EC 0C       sub     esp, 0xC                         ;  _main

// 00401003  |.  8D4424 08     lea     eax, dword ptr [esp+0x8]

// 00401007  |.  8D4C24 04     lea     ecx, dword ptr [esp+0x4]

// 0040100B  |.  8D5424 00     lea     edx, dword ptr [esp]

// 0040100F  |.  50            push    eax

// 00401010  |.  51            push    ecx

// 00401011  |.  52            push    edx

// 00401012  |.  68 34804000   push    offset <??_C@_08NNKG@?$CFd?5?$CF>;  ASCII "%d %d %d"

// 00401017  |.  E8 55000000   call    <_scanf>

// 0040101C  |.  8B4424 10     mov     eax, dword ptr [esp+0x10]

// 00401020  |.  8B4C24 14     mov     ecx, dword ptr [esp+0x14]

// 00401024  |.  03C1          add     eax, ecx

// 00401026  |.  8B4C24 18     mov     ecx, dword ptr [esp+0x18]

// 0040102A  |.  03C1          add     eax, ecx

// 0040102C  |.  50            push    eax

// 0040102D  |.  68 30804000   push    offset <??_C@_02MECO@?$CFd?$AA@> ;  ASCII "%d"

// 00401032  |.  E8 09000000   call    <_printf>

// 00401037  |.  33C0          xor     eax, eax

// 00401039  |.  83C4 24       add     esp, 0x24

// 0040103C  \.  C3            retn

        Inline函數(shù)的代碼被展開(kāi)貼到main函數(shù)中的,是吧……

        當(dāng)然,并不是所有的代碼都可以被寫(xiě)程序inline函數(shù)的,它有如下幾點(diǎn)要求:

1、  inline函數(shù)中的代碼邏輯不可過(guò)于復(fù)雜

2、  不能包含如循環(huán),switch等復(fù)雜的語(yǔ)句

 

 否則,編譯器會(huì)將inline函數(shù)當(dāng)做一個(gè)普通函數(shù)處理。

 

二、         指針與引用。

我想,雖然我沒(méi)有系統(tǒng)的講過(guò)指針,但是根據(jù)我們第一課中的內(nèi)容的提示,我相信,大家一定能夠理解指針的概念。所以我這一節(jié)不詳細(xì)講述指針的概念,

 

       引用,是C++提出來(lái)的一個(gè)新的概念,不多廢話,看代碼:

/************************************************************************/

/* 引用是C++新增加的運(yùn)算符。

/* 基本用法如下:

/************************************************************************/

void BaseUse()

{

    printf("/-----------基礎(chǔ)用法---------------/\r\n");

    int nBuf = 0;

    scanf("%d", &nBuf);     // 防止編譯器自動(dòng)優(yōu)化

 

    int &a1 = nBuf;     // 引用的用法

    int *pa1 = &nBuf;   // 指針是變量的地址

    printf("%d    %d    %d\r\n", nBuf, a1, *pa1);

}

上面代碼我們給出了引用的最基本的用法,為了我們能夠?qū)⑺c指針加以區(qū)別,我跟一指針一起使用,然后我們通過(guò)分析它的反匯編代碼,我們給出他們的區(qū)別。

 

由于Release模式下開(kāi)了O2選項(xiàng),對(duì)代碼進(jìn)行了優(yōu)化,所以我們看DEBUG模式的代碼

0040D77F  |.  8D45 FC       lea     eax, dword ptr [ebp-0x4]

0040D782  |.  50            push    eax

0040D783  |.  68 1C204200   push    0042201C               ; /format = "%d"

0040D788  |.  E8 D3210000   call    scanf                    ; \scanf

0040D78D  |.  83C4 08       add     esp, 0x8

0040D790  |.  8D4D FC       lea     ecx, dword ptr [ebp-0x4]    ; 給引用賦值

0040D793  |.  894D F8       mov     dword ptr [ebp-0x8], ecx

0040D796  |.  8D55 FC       lea     edx, dword ptr [ebp-0x4]     ; 指針的用法

0040D799  |.  8955 F4       mov     dword ptr [ebp-0xC], edx

0040D79C  |.  8B45 F4       mov     eax, dword ptr [ebp-0xC]    ; 取內(nèi)容

       

由此,我們知道,引用時(shí)當(dāng)作指針使用的,他們的傳遞方式一摸一樣,只是,引用在操作的時(shí)候,多了一個(gè)取內(nèi)容的操作。

      

       我們得出結(jié)論如下:

引用就是指針取內(nèi)容。

指針就是引用取地址。

 

當(dāng)然,如果我的這節(jié)課程到這里就結(jié)束了,似乎有點(diǎn)對(duì)不住各位同學(xué),因?yàn)槲疫@里似乎只講述了語(yǔ)法的東西,下面呢,我由引用的話題,講一下引用的一些高級(jí)用法。

 

// 定義一個(gè)學(xué)生信息的結(jié)構(gòu)體

typedef struct _DATA_STUDENT_INFO 

{

    int     nID;

    char    *szName;

    char    chsex;

}DATA_STUDENT_INFO, *PDATA_STUDENT_INFO;

 

// 聲明一個(gè)全局變量

DATA_STUDENT_INFO g_DSI[2] = {0};

 

// 返回一個(gè)結(jié)構(gòu)體的引用

DATA_STUDENT_INFO& GetStudentObj(int nIndex)

{

    return g_DSI[nIndex];

}

 

int ExtendUse()

{

    printf("/-----------擴(kuò)展用法---------------/\r\n");

    GetStudentObj(0).chsex = 1;

    GetStudentObj(0).szName = "besterChen";

    GetStudentObj(0).nID = 1;

   

    printf("I  D: %d\r\n", GetStudentObj(0).nID);

    printf("Name: %s\r\n", GetStudentObj(0).szName);

    printf(" Sex: %d\r\n", GetStudentObj(0).chsex);

   

    return 0;

}

由于引用時(shí)指針取內(nèi)容,所以,GetStudentObj返回的就是一個(gè)對(duì)象,因此可以直接對(duì)它的成員進(jìn)行操作。

 

三、         學(xué)習(xí)小結(jié)

我臨時(shí)決定講C++的,所以指針的專題等后期再講,因?yàn)橐粊?lái)我不想讓指針的話題分成兩部分討論,二來(lái)我還沒(méi)有準(zhǔn)備好講指針將的透徹(其實(shí)主要就是沒(méi)有信心)。

 

另外,我覺(jué)得,我們現(xiàn)在打下的那些基礎(chǔ)足夠我們學(xué)C++了,雖然好多朋友都說(shuō):沒(méi)有必要學(xué)習(xí)C語(yǔ)言,直接學(xué)C++即可,但是我始終相信學(xué)習(xí)C語(yǔ)言是有必要的,因?yàn)?/span>C語(yǔ)言著重內(nèi)存結(jié)構(gòu)(好讓我們把握住程序的本質(zhì)),C++著重于設(shè)計(jì)思想(也有好多的語(yǔ)法知識(shí)要學(xué))。

 

直到上個(gè)專題內(nèi)存操作,我們幾乎把C語(yǔ)言都講完了(當(dāng)然僅僅是讓人迷糊的關(guān)鍵部分),本專題是C++課程的開(kāi)始,我也著重于內(nèi)存,因?yàn)槲沂冀K相信,掌握了內(nèi)存結(jié)構(gòu)就掌握了編程的本質(zhì)。

 
       如果一直讀我的破爛文章到現(xiàn)在的朋友一定會(huì)發(fā)現(xiàn),這個(gè)系列不是給沒(méi)有一點(diǎn)基礎(chǔ)的朋友準(zhǔn)備的,也不是為了講述語(yǔ)法知識(shí)的,所以,我更新的很慢,這個(gè)更新速度足矣讓大家補(bǔ)好自己的基礎(chǔ)。

 

       所以,C++部分我會(huì)盡快的更新,因?yàn)榇蠹叶加谢A(chǔ)了。

 

       最后,祝大家成功。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美韩日高清| 久色成人在线| 欧美视频免费在线| 亚洲国产岛国毛片在线| 欧美在线|欧美| 99ri日韩精品视频| 欧美成人蜜桃| 尤物精品国产第一福利三区| 新狼窝色av性久久久久久| 亚洲精品影视在线观看| 免费亚洲电影在线| 好吊成人免视频| 久久久精品性| 亚洲欧美一区二区三区在线| 欧美日韩不卡在线| 亚洲精品乱码久久久久久日本蜜臀| 久久这里有精品视频| 午夜亚洲福利在线老司机| 国产精品卡一卡二卡三| 亚洲视频播放| 亚洲免费成人| 欧美日本一道本在线视频| 亚洲精品国产精品乱码不99| 另类春色校园亚洲| 久久精品91久久香蕉加勒比| 国产视频在线观看一区二区三区| 午夜在线精品| 亚洲欧美清纯在线制服| 国产精品yjizz| 亚洲一区久久| 亚洲视频在线一区观看| 国产精品第2页| 亚洲欧美成人综合| 亚洲字幕一区二区| 国产美女精品视频| 久久www成人_看片免费不卡| 亚洲欧美日韩精品久久久久| 国产精品亚发布| 欧美在线电影| 欧美在线观看视频一区二区| 国产一区二区三区日韩欧美| 久久久久这里只有精品| 久久国产精品网站| 在线观看国产日韩| 亚洲大胆视频| 欧美国产综合一区二区| 一本色道久久99精品综合| 日韩视频二区| 国产精品久久久久一区二区三区| 欧美亚洲色图校园春色| 欧美一区激情| 亚洲成色777777女色窝| 亚洲国产精品免费| 欧美日韩精品久久久| 亚洲综合色网站| 午夜在线一区二区| 伊大人香蕉综合8在线视| 欧美国产乱视频| 欧美屁股在线| 欧美一级大片在线观看| 久久国产精品色婷婷| 91久久精品国产91久久性色tv| 91久久精品www人人做人人爽| 欧美日韩在线免费观看| 欧美伊人久久久久久久久影院| 欧美中文字幕在线观看| 亚洲日韩欧美一区二区在线| 99精品国产一区二区青青牛奶| 国产精品视频九色porn| 久久一区国产| 欧美精品www| 亚洲自拍偷拍麻豆| 久久国产日韩| 99日韩精品| 午夜欧美不卡精品aaaaa| 亚洲福利一区| 中日韩午夜理伦电影免费| 国外成人网址| 亚洲精品一区二区三区av| 国产乱码精品一区二区三区五月婷 | 久久狠狠亚洲综合| 亚洲精品一区二区三区在线观看 | 老司机aⅴ在线精品导航| 亚洲免费高清| 亚洲欧美精品| 亚洲狼人综合| 先锋影音国产精品| 日韩视频中午一区| 亚洲欧美日韩一区二区三区在线| 亚洲国产高清视频| 亚洲午夜一区| 亚洲人体1000| 欧美一区二区在线免费播放| 亚洲免费高清| 久久九九电影| 亚洲欧美日韩在线不卡| 美女露胸一区二区三区| 欧美一二区视频| 美女脱光内衣内裤视频久久影院| 午夜老司机精品| 欧美成人有码| 久久精品国产99国产精品| 欧美精品在线观看播放| 久久久久在线观看| 欧美系列一区| 亚洲风情在线资源站| 国产性色一区二区| 99re6热只有精品免费观看| 在线观看一区| 亚洲欧美日韩另类精品一区二区三区 | 欧美福利视频在线| 久久久噜噜噜久久狠狠50岁| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲电影免费在线| 亚洲欧美日韩直播| 亚洲图片在线| 欧美精品一区二区三区在线播放| 久久先锋资源| 国产精品久久久久一区二区三区共 | 麻豆国产精品一区二区三区 | 久久精品国产精品| 欧美午夜电影在线| 亚洲国产精品一区制服丝袜| 黑人巨大精品欧美一区二区| 亚洲视频在线免费观看| 夜夜嗨av一区二区三区网站四季av | 亚洲天堂av综合网| 欧美大片在线观看一区二区| 老司机午夜精品| 国产亚洲激情在线| 亚洲综合国产| 亚洲欧美日韩中文视频| 欧美日韩午夜在线| 91久久香蕉国产日韩欧美9色| 亚洲高清毛片| 久久婷婷麻豆| 猛男gaygay欧美视频| 国产一区二区三区免费不卡| 亚洲欧美第一页| 小处雏高清一区二区三区 | 日韩视频一区二区三区在线播放免费观看 | 久久深夜福利| 国产亚洲欧美日韩美女| 午夜国产精品视频免费体验区| 亚洲欧美日韩成人| 国产精品久在线观看| 亚洲一区二区精品| 午夜视频在线观看一区二区| 国产精品萝li| 亚洲男人的天堂在线| 性久久久久久久久| 国产欧美欧洲在线观看| 亚洲一区免费| 久久国产精品久久w女人spa| 国产农村妇女精品| 午夜在线电影亚洲一区| 久久国产黑丝| 好看的av在线不卡观看| 久久久久欧美| 欧美激情一区| 日韩一区二区精品葵司在线| 欧美久久在线| 一区二区三区国产精品| 午夜精品久久久久久久| 国产日韩欧美成人| 久久精品免视看| 欧美韩国日本一区| 99国产精品久久久久久久久久| 欧美日韩另类综合| 亚洲视频1区| 久久国产主播精品| 尤物精品国产第一福利三区 | 麻豆av一区二区三区| 亚洲高清在线精品| 欧美精品aa| 亚洲视频久久| 久久免费视频观看| 91久久线看在观草草青青| 欧美美女bb生活片| 亚洲一区二区三| 老司机午夜精品视频| 亚洲精品中文字幕有码专区| 欧美色视频在线| 欧美影院一区| 亚洲二区三区四区| 亚洲女爱视频在线| 激情久久影院| 欧美区在线观看| 亚洲欧美一区二区三区久久| 麻豆精品在线视频| 一区二区三区视频在线观看| 国产嫩草一区二区三区在线观看 | 欧美成人激情在线| 99re66热这里只有精品3直播 | 国产精品亚洲一区| 久久视频一区二区| 一本大道av伊人久久综合| 久久久五月婷婷| 日韩一级片网址| 国产日韩欧美不卡|