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

聚星亭

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

       C++的階段,我想根據(jù)C++的一些特有的特性分別寫一些專題,每個專題我都捎帶講一些語法,當(dāng)然不會很多,我還是會像C語言那樣,內(nèi)存結(jié)構(gòu)貫穿始終,有匯編就有真相……

 

       本專題,我們講述封裝性。封裝性是C++的入門特性,要想學(xué)習(xí)C++語言,封裝性是首先要掌握的。下面我們進(jìn)入正題:

一、       類與對象

早在本系列第一節(jié)課(理解程序中的數(shù)據(jù))的時候講述過數(shù)據(jù)類型與數(shù)據(jù)的區(qū)別和聯(lián)系當(dāng)時得出的結(jié)論如下:

Ø         數(shù)據(jù)類型規(guī)定了數(shù)據(jù)的大小和表現(xiàn)形式

Ø         數(shù)據(jù)就是電腦中存放的數(shù)。

Ø         每個數(shù)據(jù)都有自己的地址,而這些地址可以有變量來代替

Ø         因此,數(shù)據(jù)通常存放于變量(或常量)中

 

這個結(jié)論在C++中仍然同樣適用,類就是我們自己定義的復(fù)雜的數(shù)據(jù)類型,而對象則就是由類聲明的變量。下面我們進(jìn)入純語法層面。

1、 類的定義方法

我相信,大家都還記得我在第一節(jié)課的時候講述的結(jié)構(gòu)體的課程,也相信大家沒有忘記怎么定義一個結(jié)構(gòu)體。下面我給出類的定義方法:

class CExample   // 是不是很像定義一個結(jié)構(gòu)體

{

private: // 權(quán)限控制,相關(guān)內(nèi)容在下面的小節(jié)中詳細(xì)講述

       int   m_nFirstNum;   // 定義成員變量。也叫屬性

       int   m_nSecNum;

public:

       int   GetSum(){return  m_nFirstNum}  // 成員函數(shù)

       bool  SetNum(int nFirst, int nSec)

{

m_nFirstNum  =  nFirst; 

m_nSecNum  =  nSec ;

return true;

}

       CExample(){m_nFirstNum = 0;  m_nSecNum = 0;}        //構(gòu)造函數(shù)

       ~CExample(){}                    // 空析構(gòu)

};

當(dāng)然,上面這個類的定義是不是很像定義一個結(jié)構(gòu)體?只不過多了個privatepublic還有一些函數(shù)。是的,C++里面,將結(jié)構(gòu)體升級了,結(jié)構(gòu)體里面可以有函數(shù)成員了,為了兼容,換了個關(guān)鍵字,當(dāng)然,上面的這個class完全可以改成struct,一點(diǎn)問題都沒有。

 

好奇的朋友會問:如果函數(shù)體的語句太多,邏輯復(fù)雜了,函數(shù)很大,那這個類豈不是很難看,太臃腫了吧。

 

是的,為了方便類的組織,也為了協(xié)調(diào)項(xiàng)目工程中文件的組織。上面的類還可以寫成如下的形式:

// .h文件中寫如下的聲明部分

class CExample   // 是不是很像定義一個結(jié)構(gòu)體

{

private: // 權(quán)限控制,相關(guān)內(nèi)容在下面的小節(jié)中詳細(xì)講述

       int   m_nFirstNum;   // 定義成員變量。也叫屬性

       int   m_nSecNum;

public:

       int   GetSum();  // 成員函數(shù)

       bool  SetNum(int nFirst, int nSec);

       CExample();   //構(gòu)造函數(shù)

       ~CExample();               // 空析構(gòu)

};

 

// .cpp 文件中寫如下的定義及實(shí)現(xiàn)部分

CExample::CExample()

{

}

CExample::~CExample()

{

}

 

int CExample::GetFirstNum()

{

    return m_nFirstNum;

}

 

int CExample::GetSecNum()

{

    return m_nSecNum;

}

 

bool CExample::SetNum(int nFirst, int nSec)

{

m_nFirstNum  =  nFirst; 

m_nSecNum  =  nSec ;

return true;

}

 

int CExample::GetSum()

{

       return m_nFirstNum+m_nSecNum;

}

上面兩種寫法也是有區(qū)別的,第一種方法寫的函數(shù)具有Inline函數(shù)的特性。后一種則沒有。

2、 屬性和方法的使用

                     C++中定義一個對象跟定義一個函數(shù)沒有什么區(qū)別。

#include <stdio.h>

#include "Example.h"

 

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

{

    CExample obj_Exp;       // 定義一個對象

    obj_Exp.SetNum(10, 20); // 調(diào)用一個方法

 

    printf("%d+%d = %d\r\n", obj_Exp.GetFirstNum(),

                          obj_Exp.GetSecNum(),

                          obj_Exp.GetSum());

 

       return 0;

}

       由此,我們就可以通過一個函數(shù)間接的來操作我們的變量,用戶在給我們的變量賦值時,我們可以通過Set函數(shù)來對輸入的內(nèi)容作檢測,在獲取一個變量的內(nèi)容時,我們可以通過一個函數(shù)來取得,這樣都提高了程序安全性。

 

       從程序設(shè)計(jì)的角度來講,如果我們以類為單位編碼的話,每個模塊都是獨(dú)立的我們只要關(guān)注與本類相關(guān)操作,比如人這個類,它一般情況下有兩個眼睛、一個嘴巴等之類的屬性,人可以使用工具,可以行走,可以跳躍等方法。我們編寫的所有的函數(shù)都是針對這些展開的。而不用去關(guān)心誰要使用這個類。因此,類/對象概念的加入,不單單是給編碼方式做了改變,主要是設(shè)計(jì)思路的改變,程序模塊化的改變等等。

二、       解析對象的內(nèi)存結(jié)構(gòu)

       現(xiàn)在,我相信,如果習(xí)慣了我這種學(xué)習(xí)方式的朋友一定會很好奇,類定義對象的內(nèi)存格式是怎樣的,它是不是像一個普通變量那樣,或者是不是像一個結(jié)構(gòu)體變量那樣在內(nèi)存里連續(xù)的將各個成員組織到一起,它又是怎樣將各個成員變量還有函數(shù)綁定到一起的?變量和函數(shù)在一起它是怎么組織的?本小節(jié)讓我們來解決這些問題。

 

       為節(jié)省篇幅,我們?nèi)耘f使用上面的代碼。我們用VC的調(diào)試器,調(diào)試這個代碼:

      

       注意看我們的變量監(jiān)視區(qū),我們定義的對象的內(nèi)容跟結(jié)構(gòu)體成員的內(nèi)容格式差不多,(是按照定義的順序連續(xù)存放的,這點(diǎn)跟普通的局部變量不一樣,普通的局部變量在內(nèi)存中的順序與定義順序相反)內(nèi)存中只存放了成員變量,它并沒有標(biāo)出SetNum的位置,那它是怎么找到SetNum這個函數(shù)的呢?

 

       根據(jù)我們先前調(diào)試C函數(shù)的經(jīng)驗(yàn),我們知道,函數(shù)的代碼是被放在可執(zhí)行文件的代碼區(qū)段中的。在這個代碼中,也有調(diào)用SetNum的代碼,我們詳細(xì)的跟一下它的匯編代碼:

10:       CExample obj_Exp;

004011ED   lea         ecx,[ebp-14h]

004011F0   call        @ILT+15(CExample::CExample) (00401014)

004011F5   mov         dword ptr [ebp-4],0

11:       obj_Exp.SetNum(10, 20);

004011FC   push        14h

004011FE   push        0Ah

00401200   lea         ecx,[ebp-14h]

00401203   call        @ILT+0(CExample::SetNum) (00401005)

 

       這段代碼又給我們帶來了新的問題,我們只用類定義了一個對象(變量),它自動的調(diào)用了一個函數(shù),根據(jù)注釋我們知道它調(diào)用的是構(gòu)造函數(shù)。我們跟進(jìn)去看下:

11:   CExample::CExample()

12:   {

00401050   push        ebp

00401051   mov         ebp,esp

00401053   sub         esp,44h

00401056   push        ebx

00401057   push        esi

00401058   push        edi

00401059   push        ecx                                ; 保存寄存器環(huán)境

0040105A   lea         edi,[ebp-44h]

0040105D   mov         ecx,11h

00401062   mov         eax,0CCCCCCCCh        

00401067   rep stos    dword ptr [edi]    ; 將棧空間清為CCRelease編譯就沒有這部分代碼了。)

00401069   pop         ecx                        

0040106A   mov         dword ptr [ebp-4],ecx    ; ECX中的內(nèi)容給局部變量

13:   }

0040106D   mov         eax,dword ptr [ebp-4]    ; ECX的內(nèi)容返回

00401070   pop         edi

00401071   pop         esi

00401072   pop         ebx

00401073   mov         esp,ebp

00401075   pop         ebp

00401076   ret

       這段代碼,首次看還真看不出個所以然來,源碼的構(gòu)造函數(shù)中,我們什么都沒寫,是個空函數(shù),而這里做的是返回ECX的值,可是這個函數(shù)也沒有對ECX做什么特別的操作,而是直接使用進(jìn)函數(shù)時ECX的值。那只能說明在調(diào)用這個函數(shù)前,ECX發(fā)生了變化。我們再回頭看下調(diào)用構(gòu)造函數(shù)的代碼:

10:       CExample obj_Exp;

004011ED   lea         ecx,[ebp-14h]

004011F0   call        @ILT+15(CExample::CExample) (00401014)

004011F5   mov         dword ptr [ebp-4],0

       哈哈,它是把我們obj_Exp對象的地址給了ECX,然后調(diào)用構(gòu)造返回的,也就是說,構(gòu)造的返回值是我們對象的首地址。哎,迷糊了,真搞不懂這是在干什么。先不管他,我們繼續(xù)看怎么調(diào)用的SetNum這個函數(shù)吧:

11:       obj_Exp.SetNum(10, 20);

004011FC   push        14h                        ; 傳遞參數(shù)

004011FE   push        0Ah

00401200   lea         ecx,[ebp-14h]           ; 也有這句,還是把我們的對象首地址給ECX

00401203   call        @ILT+0(CExample::SetNum) (00401005)

29:   bool CExample::SetNum(int nFirst, int nSec)

30:   {

00401130   push        ebp

00401131   mov         ebp,esp

00401133   sub         esp,44h

00401136   push        ebx

00401137   push        esi

00401138   push        edi

00401139   push        ecx

0040113A   lea         edi,[ebp-44h]

0040113D   mov         ecx,11h

00401142   mov         eax,0CCCCCCCCh

00401147   rep stos    dword ptr [edi]

00401149   pop         ecx

0040114A   mov         dword ptr [ebp-4],ecx    ; 備份一下我們的對象首地址

31:       m_nFirstNum  =  nFirst;

0040114D   mov         eax,dword ptr [ebp-4]    ; 取出對象首地址

00401150   mov         ecx,dword ptr [ebp+8]    ; 取出nFirst參數(shù)

00401153   mov         dword ptr [eax],ecx        ; 給對象首地址指向的內(nèi)容賦值為nFirst的內(nèi)容

32:       m_nSecNum  =  nSec ;

00401155   mov         eax,dword ptr [ebp-4]    ; 取出對象首地址

00401158   mov         ecx,dword ptr [ebp+0Ch]; 取出nSec參數(shù)

0040115B   mov         dword ptr [eax+4],ecx    ; 給對象首地址+4指向的你內(nèi)容賦值

          return true;

0040115E   mov         al,1          ; 返回1

34:   }

00401160   pop         edi

00401161   pop         esi

00401162   pop         ebx

00401163   mov         esp,ebp

00401165   pop         ebp

00401166   ret         8

       我簡要的注釋下來一下上面的代碼。通過分析上面的代碼,我們可以得出這樣的結(jié)論:

A、 函數(shù)通過ecx傳遞了我們對象的首地址。

B、 函數(shù)通過ecx傳遞的對象首地址定位對象的每個成員變量。

       這樣,很明顯,ECX起到了傳遞參數(shù)的作用,這時ecx中的地址有個專業(yè)術(shù)語,叫做this指針。

 

       OK,這就是一個新的知識點(diǎn),我們成員函數(shù)的調(diào)用方式。

1、 成員函數(shù)的調(diào)用方式: __thiscall

       記得在前面章節(jié)介紹函數(shù)時,講過一些調(diào)用方式,但是沒有提到過這種調(diào)用方式。下面我做一個簡要的總結(jié):

A、 參數(shù)也通過棧傳遞。

B、 它用一個寄存器來傳遞this指針。

C、 本條特性摘自《加密與解密》(第三版)非原文:

a)         對于VC++中傳參規(guī)則:

                                                                   i.              最左邊兩個不大于4字節(jié)的參數(shù)分別用ECXEDX傳參數(shù).

                                                                 ii.              對于浮點(diǎn)數(shù)、遠(yuǎn)指針、__int64類型總是通過棧來傳遞的。

b)        對于BC++|DELPHI中的傳遞規(guī)則:

                                                                   i.              最左邊三個不大于DWORD的參數(shù),依次使用EAX,ECX,EDX傳遞,其它多的參數(shù)依次通過PASCAL方式傳遞。

 

       這樣,函數(shù)的地址還是在代碼區(qū)域,對象的內(nèi)存中只存放數(shù)據(jù)成員,當(dāng)我們要調(diào)用成員函數(shù)時,就通過一個寄存器將函數(shù)操作的對象的首地址(也就是this指針)傳遞過去就可以了,傳遞不同的對象指針,就操作不同的數(shù)據(jù)。哈哈,太巧妙了。

2、 淺談構(gòu)造與析構(gòu)函數(shù)

                     OK,繼續(xù)調(diào)試代碼:

13:       printf("%d+%d = %d\r\n", obj_Exp.GetFirstNum(),

14:                                obj_Exp.GetSecNum(),

15:                                obj_Exp.GetSum());

00401208   lea         ecx,[ebp-14h]

0040120B   call        @ILT+30(CExample::GetSum) (00401023)             ; 調(diào)用GetSum函數(shù)

00401210   push        eax

00401211   lea         ecx,[ebp-14h]

00401214   call        @ILT+5(CExample::GetSecNum) (0040100a)

00401219   push        eax

0040121A   lea         ecx,[ebp-14h]

0040121D   call        @ILT+10(CExample::GetFirstNum) (0040100f)

00401222   push        eax

00401223   push        offset string "%d+%d = %d\r\n" (0042501c)

00401228   call        printf (00401290)

0040122D   add         esp,10h

16:

17:       return 0;

00401230   mov         dword ptr [ebp-18h],0

00401237   mov         dword ptr [ebp-4],0FFFFFFFFh

0040123E   lea         ecx,[ebp-14h]

00401241   call        @ILT+20(CExample::~CExample) (00401019) ; 調(diào)用析構(gòu)函數(shù)

00401246   mov         eax,dword ptr [ebp-18h]

       我們至始至終都沒有調(diào)用過構(gòu)造和析構(gòu)函數(shù)。但是,通過這次調(diào)我們知道,在創(chuàng)建一個對象(變量)的時候,我們的程序會自動的調(diào)用我們的構(gòu)造函數(shù),在要出對象作用域的時候,會自動的調(diào)用析構(gòu)函數(shù)。

 

       這樣,我們很容易就能想象出,構(gòu)造和析構(gòu)的用途:構(gòu)造就做初始化對象的各個成員,申請空間等初始化工作。析構(gòu)就做一些釋放申請的空間啊之類的清理工作。

 

       就這樣,C++將數(shù)據(jù)跟函數(shù)封裝到了一起,這樣我們每個類產(chǎn)生的對象都是一個獨(dú)立的個體,它有一個自己的運(yùn)作方式,幾乎完全獨(dú)立。在我們使用它的時候,根本不需要它是怎么實(shí)現(xiàn)了,只要知道怎么使用即可。

三、       淺談類的靜態(tài)成員

       通過前面幾節(jié)的學(xué)習(xí),我們大概的能理解類的封裝性及其運(yùn)作過程,但是,如果我們繼續(xù)深入的學(xué)習(xí)C++,我們很快就能發(fā)現(xiàn)一個問題:我們上面說的所有的成員都是屬于對象的,也就是說,我們必須先通過類來定義一個對象才可以操作。但是有的時候,我們需要一些屬于類的成員,比如:人都有一個腦袋,這一個腦袋屬于人類共有的特性。不需要具體到哪一個人,我們都可以確定人只有一個腦袋。

 

       放到類中也一樣,比如我們需要知道當(dāng)前這個類創(chuàng)建了幾個對象的時候,我們不必在創(chuàng)建一個新的對象只需要使用類的相關(guān)函數(shù)或者直接訪問類的某些屬性就可以了,而這些函數(shù)或者變量,它肯定不可能屬于某個對象,它應(yīng)該屬于這個類本身。

 

       OK,下面就來體驗(yàn)一下靜態(tài)帶給我們的一些好處。同樣,我們將前面的代碼添加點(diǎn)兒東西(見Exp02:

       // .h文件中

public:

    static int m_nCount; // 統(tǒng)計(jì)產(chǎn)生對象的

    static int print(const char *szFormat, ...);    // 讓我們的類有自己的輸出函數(shù)

       // .cpp文件中

int CExample::m_nCount = 0; // 初始化靜態(tài)成員變量

CExample::CExample()

{

    m_nCount++;        // 當(dāng)創(chuàng)建一個對象的時候,這個變量加1

}

 

CExample::~CExample()

{

    if (m_nCount > 0)

    {

        m_nCount--;   // 當(dāng)對象銷毀時,這個變量減1

    }

}

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

/*讓我們的CExample可以打印自己的信息

/*支持多參,同printf用法相同

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

int CExample::print(const char *szFormat, ...)

{

    if (!szFormat)

    {

        return 0;

    }

 

    va_list   pArgs;

    char      szBuffer[256 * 15] = {0};

    va_start(pArgs, szFormat);  

    vsprintf(szBuffer, szFormat, pArgs);

    va_end(pArgs);

 

    printf(szBuffer);

    return strlen(szFormat);

}

 

              好,有了這些,我們可以編寫如下的測試代碼:

#include "stdafx.h"

#include <stdio.h>

#include "Example.h"

 

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

{

    CExample obj_Exp1;

    CExample::print("當(dāng)前對象的數(shù)量為:%d\r\n", CExample::m_nCount);

 

    if (1)

    {

        CExample obj_Exp2; // 該對象屬于if作用域,出了if,對象自動銷毀

        CExample::print("當(dāng)前對象的數(shù)量為:%d\r\n", CExample::m_nCount);

    }

 

    CExample::print("當(dāng)前對象的數(shù)量為:%d\r\n", CExample::m_nCount);

 

       return 0;

}

              我想大家應(yīng)該能想象出來運(yùn)行的結(jié)果:

             

              好,我們調(diào)試一下這段程序:

11:       CExample::print("當(dāng)前對象的數(shù)量為:%d\r\n", CExample::m_nCount);

004012EC   mov         eax,[CExample::m_nCount (0042ae6c)]       ;這明顯告訴我們,靜態(tài)就是全局

004012F1   push        eax

004012F2   push        offset string "當(dāng)前對象的數(shù)量為:%d\r\n "

004012F7   call        @ILT+30(CExample::print) (00401023)    ; 調(diào)用該靜態(tài)函數(shù)沒有傳遞this指針

004012FC   add         esp,8

    多了不用看了,通過這段代碼,我們很明顯就可以清楚,靜態(tài)變量,不屬于類對象,它存放于全局?jǐn)?shù)據(jù)區(qū),同全局變量在一個地方(更多關(guān)于靜態(tài)變量的相關(guān)說明見我發(fā)的《static學(xué)習(xí)筆記》一文)。

 

    靜態(tài)函數(shù),跟全局函數(shù)一樣,它雖然在源碼中書寫與類內(nèi),但是它其實(shí)就是一個全局函數(shù),不傳遞this指針,因此,在使用靜態(tài)函數(shù)時需要知道,靜態(tài)函數(shù)中不能調(diào)用其它普通的成員函數(shù)也不能引用普通的成員變量。但是反過來,在其它的成員函數(shù)中可以調(diào)用靜態(tài)函數(shù)也可以使用靜態(tài)變量。

四、       打破類封裝性的棒槌 —— 友元

       當(dāng)我們的工程總類越來越多的時候,我們很難避免類與類之間相互操作。倘若每個類之間相互操作都通過函數(shù)進(jìn)行,那可想我們編寫代碼是多么的繁瑣,想投機(jī)取巧走小路么?是的,C++提供了這種捷徑,讓我們直接對一個類的私有成員進(jìn)行操作——當(dāng)然,我極力反對這種做法,因?yàn)樗蚱屏祟惖姆庋b性。

 

       我不推薦使用友元在這里仍然講述友元并不是我無聊也不是我寫它裝門面。因?yàn)槲覀冊俸竺鎸W(xué)習(xí)用全局函數(shù)運(yùn)算符的時候,不可避免的要使用到它。

 

       聲明友元的關(guān)鍵字是friendOK,看代碼,我們還是在上面的代碼中加點(diǎn)東西(Exp03):

// Example.h

       friend extern void ShowPrivMem(CExample tmpExpObj);

       聲明ShowPrivMem函數(shù)是CExample類的友元函數(shù),這時ShowPrivMem中就可以隨便訪問CExample 類中任何一個成員了。

 

              編寫測試代碼如下:

void ShowPrivMem(CExample tmpExpObj)

{

    printf("%d+%d = %d\r\n", tmpExpObj.m_nFirstNum,

                             tmpExpObj.m_nSecNum,

                             tmpExpObj.GetSum());

}

 

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

{

    CExample obj_Exp;

    obj_Exp.SetNum(10, 20);

 

    ShowPrivMem(obj_Exp);

 

       return 0;

}

       當(dāng)然,這是將一個函數(shù)聲明為友元,將另外一個類聲明為自己的友元也是一樣的。由于沒有什么特別之處,我就不為此特別的寫一個代碼了。

 

       另外,需要注意的是,將一個類聲明為自己的友元,并不是自己可以訪問那個類的私有成員而是被聲明為友元的類可以訪問自己的私有成員。注意順序別弄反了……。

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

       本節(jié)講的東西很少,但是很關(guān)鍵,調(diào)試C++程序,摸清楚this指針對摸清程序結(jié)構(gòu),摸清程序數(shù)據(jù)格式都起著非常重要的作用。

 

       學(xué)習(xí)本小節(jié)的方法,不是理解,而是多寫,多調(diào)試。

 

       祝大家成功。

Feedback

# re: 笨鳥先飛學(xué)編程系列-淺析C++的封裝性[未登錄]  回復(fù)  更多評論   

2010-03-12 08:59 by dophi
贊一個,懂點(diǎn)匯編確實(shí)對理解c++的對象模型很有幫助啊
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本一本大道香蕉久在线精品| 99riav国产精品| 久久久九九九九| 午夜欧美大片免费观看| 一本色道久久综合狠狠躁篇的优点| 在线日韩精品视频| 国内激情久久| 国产无遮挡一区二区三区毛片日本| 欧美午夜激情小视频| 欧美人交a欧美精品| 你懂的网址国产 欧美| 久久精品亚洲热| 性欧美办公室18xxxxhd| 亚洲欧美在线磁力| 亚洲主播在线播放| 亚洲欧美自拍偷拍| 午夜精品成人在线| 亚洲欧美精品伊人久久| 亚洲欧美成人在线| 亚欧美中日韩视频| 欧美专区日韩视频| 久久久www| 美女黄网久久| 欧美国产在线观看| 欧美精品尤物在线| 欧美肉体xxxx裸体137大胆| 欧美日韩亚洲一区二| 欧美三级网址| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品日韩精品| 国产亚洲精品aa| 一区一区视频| 亚洲人成网站999久久久综合| 亚洲美女av在线播放| 一区二区三区欧美视频| 亚洲在线播放电影| 欧美综合国产| 美女精品在线观看| 亚洲国产老妈| 99亚洲一区二区| 亚洲自拍三区| 久久久综合精品| 欧美大片国产精品| 欧美午夜久久久| 国产欧美日韩一区| 在线免费高清一区二区三区| 亚洲看片免费| 午夜精品视频在线观看一区二区| 久久福利电影| 欧美国产一区视频在线观看| 日韩视频中文| 小处雏高清一区二区三区| 久久久久久香蕉网| 欧美精品免费播放| 国产精品视频一区二区三区| 精品51国产黑色丝袜高跟鞋| 亚洲美女中出| 久久成人一区| 亚洲国产精品成人综合色在线婷婷 | 久久激情一区| 欧美韩日一区二区| 国产精品亚洲美女av网站| 黄色另类av| 夜久久久久久| 久久久久久高潮国产精品视| 亚洲黄一区二区三区| 亚洲一区久久久| 麻豆国产精品va在线观看不卡| 欧美色偷偷大香| 在线免费高清一区二区三区| 一本一本久久a久久精品综合妖精| 欧美在线免费播放| 91久久久久久| 久久国产视频网站| 欧美日韩视频第一区| 好吊视频一区二区三区四区| 制服丝袜亚洲播放| 你懂的视频欧美| 亚洲午夜精品在线| 欧美成年人在线观看| 国产精品资源| 一区二区三区免费看| 久久天天狠狠| 亚洲图片自拍偷拍| 欧美黄色网络| 极品尤物久久久av免费看| 亚洲制服av| 亚洲激情av在线| 久久九九99| 国产欧美日本一区二区三区| 一本久道久久久| 欧美大片在线观看| 欧美一区日本一区韩国一区| 欧美先锋影音| 日韩一级裸体免费视频| 男女激情久久| 欧美一区二区三区在线| 国产精品高潮呻吟久久av黑人| 亚洲国产精品小视频| 久久久免费精品视频| 亚洲一区亚洲二区| 欧美视频官网| 99视频日韩| 亚洲国产高清在线| 久久夜色精品国产欧美乱极品| 国产欧美精品一区aⅴ影院| 亚洲一区二区三区精品动漫| 亚洲欧洲精品天堂一级| 久久综合给合久久狠狠狠97色69| 国产亚洲精品7777| 欧美一区二区三区在| 一本色道**综合亚洲精品蜜桃冫| 欧美激情片在线观看| 91久久久亚洲精品| 欧美二区在线播放| 久久亚洲捆绑美女| 好吊妞**欧美| 久久青草欧美一区二区三区| 午夜精品久久久久久99热| 国产精品免费一区二区三区在线观看| 99热在这里有精品免费| 亚洲高清激情| 欧美激情国产日韩| 亚洲精品在线视频观看| 亚洲第一中文字幕在线观看| 麻豆91精品| 91久久国产综合久久| 亚洲高清视频在线| 欧美精品午夜| 日韩一级二级三级| 亚洲精品无人区| 欧美日韩视频专区在线播放| 国产精品99久久久久久久女警| 亚洲看片网站| 国产精品久久波多野结衣| 亚洲欧美伊人| 午夜激情综合网| 狠狠色2019综合网| 欧美a级一区| 欧美激情精品久久久久久变态| 亚洲美女色禁图| 日韩亚洲欧美一区| 国产精品热久久久久夜色精品三区| 欧美一区二区高清| 久久国内精品自在自线400部| 在线不卡中文字幕| 亚洲第一色在线| 欧美日韩一区视频| 欧美影院在线| 久久人人爽人人爽爽久久| 亚洲三级免费| 一本色道久久综合亚洲精品按摩| 国产精品亚洲成人| 美女被久久久| 欧美日本免费| 久久成人久久爱| 久久综合久久综合久久综合| 一本色道久久综合亚洲精品小说| 一区二区高清在线观看| 国产一区二区三区电影在线观看| 欧美成人精品三级在线观看| 欧美日本一道本| 欧美一区三区二区在线观看| 久久中文欧美| 亚洲影视九九影院在线观看| 欧美一区免费视频| 亚洲六月丁香色婷婷综合久久| 夜夜嗨一区二区| 黄色成人91| 亚洲精品色图| 国内精品久久久久久| 91久久久亚洲精品| 国产日产亚洲精品| 亚洲国产精品精华液2区45| 国产精品国产三级国产aⅴ9色| 久久色在线播放| 欧美日韩国产在线播放| 久久精品一区二区三区不卡| 欧美激情欧美狂野欧美精品| 欧美在线观看一区| 欧美成人在线影院| 欧美一级一区| 欧美精品福利在线| 久久久久综合一区二区三区| 欧美黄色一区| 久久久噜噜噜久久久| 欧美日韩伦理在线| 久久久久久9999| 欧美婷婷在线| 欧美成人一区二区三区在线观看| 国产精品a久久久久久| 欧美大色视频| 国产日韩视频一区二区三区| 亚洲日本中文| 在线观看91久久久久久| 亚洲在线播放| 一区二区三区日韩在线观看| 久久久欧美一区二区| 午夜精品久久久久影视| 欧美国产日韩a欧美在线观看|