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

Design&Art

C++博客 首頁 新隨筆 聯系 聚合 管理
  26 Posts :: 0 Stories :: 38 Comments :: 0 Trackbacks

#

(zz) C++箴言:理解typename的兩個含義

  問題:在下面的 template declarations(模板聲明)中 class 和 typename 有什么不同?
template<class T> class Widget; // uses "class"
template<typename T> class Widget; // uses "typename"
  答案:沒什么不同。在聲明一個 template type parameter(模板類型參數)的時候,class 和 typename 意味著完全相同的東西。一些程序員更喜歡在所有的時間都用 class,因為它更容易輸入。其他人(包括我本人)更喜歡 typename,因為它暗示著這個參數不必要是一個 class type(類類型)。少數開發(fā)者在任何類型都被允許的時候使用 typename,而把 class 保留給僅接受 user-defined types(用戶定義類型)的場合。但是從 C++ 的觀點看,class 和 typename 在聲明一個 template parameter(模板參數)時意味著完全相同的東西。

  然而,C++ 并不總是把 class 和 typename 視為等同的東西。有時你必須使用 typename。為了理解這一點,我們不得不討論你會在一個 template(模板)中涉及到的兩種名字。

  假設我們有一個函數的模板,它能取得一個 STL-compatible container(STL 兼容容器)中持有的能賦值給 ints 的對象。進一步假設這個函數只是簡單地打印它的第二個元素的值。它是一個用糊涂的方法實現的糊涂的函數,而且就像我下面寫的,它甚至不能編譯,但是請將這些事先放在一邊——有一種方法能發(fā)現我的愚蠢:
template<typename C> // print 2nd element in
void print2nd(const C& container) // container;

 
// this is not valid C++!
 if (container.size() >= 2{
  C::const_iterator iter(container.begin()); 
// get iterator to 1st element
  ++iter; // move iter to 2nd element
  int value = *iter; // copy that element to an int
  std::cout << value; // print the int
 }

}
  我突出了這個函數中的兩個 local variables(局部變量),iter 和 value。iter 的類型是 C::const_iterator,一個依賴于 template parameter(模板參數)C 的類型。一個 template(模板)中的依賴于一個 template parameter(模板參數)的名字被稱為 dependent names(依賴名字)。當一個 dependent names(依賴名字)嵌套在一個 class(類)的內部時,我稱它為 nested dependent name(嵌套依賴名字)。C::const_iterator 是一個 nested dependent name(嵌套依賴名字)。實際上,它是一個 nested dependent type name(嵌套依賴類型名),也就是說,一個涉及到一個 type(類型)的 nested dependent name(嵌套依賴名字)。

  print2nd 中的另一個 local variable(局部變量)value 具有 int 類型。int 是一個不依賴于任何 template parameter(模板參數)的名字。這樣的名字以 non-dependent names(非依賴名字)聞名。(我想不通為什么他們不稱它為 independent names(無依賴名字)。如果,像我一樣,你發(fā)現術語 "non-dependent" 是一個令人厭惡的東西,你就和我產生了共鳴,但是 "non-dependent" 就是這類名字的術語,所以,像我一樣,轉轉眼睛放棄你的自我主張。)

  nested dependent name(嵌套依賴名字)會導致解析困難。例如,假設我們更加愚蠢地以這種方法開始 print2nd:
template<typename C>
void print2nd(const C& container)
{
 C::const_iterator 
* x;
 
//
}
  這看上去好像是我們將 x 聲明為一個指向 C::const_iterator 的 local variable(局部變量)。但是它看上去如此僅僅是因為我們知道 C::const_iterator 是一個 type(類型)。但是如果 C::const_iterator 不是一個 type(類型)呢?如果 C 有一個 static data member(靜態(tài)數據成員)碰巧就叫做 const_iterator 呢?再如果 x 碰巧是一個 global variable(全局變量)的名字呢?在這種情況下,上面的代碼就不是聲明一個 local variable(局部變量),而是成為 C::const_iterator 乘以 x!當然,這聽起來有些愚蠢,但它是可能的,而編寫 C++ 解析器的人必須考慮所有可能的輸入,甚至是愚蠢的。

  直到 C 成為已知之前,沒有任何辦法知道 C::const_iterator 到底是不是一個 type(類型),而當 template(模板)print2nd 被解析的時候,C 還不是已知的。C++ 有一條規(guī)則解決這個歧義:如果解析器在一個 template(模板)中遇到一個 nested dependent name(嵌套依賴名字),它假定那個名字不是一個 type(類型),除非你用其它方式告訴它。缺省情況下,nested dependent name(嵌套依賴名字)不是 types(類型)。(對于這條規(guī)則有一個例外,我待會兒告訴你。)

  記住這個,再看看 print2nd 的開頭:
template<typename C>
void print2nd(const C& container)
{
 
if (container.size() >= 2) {
  C::const_iterator iter(container.begin()); 
// this name is assumed to
   // not be a type
  這為什么不是合法的 C++ 現在應該很清楚了。iter 的 declaration(聲明)僅僅在 C::const_iterator 是一個 type(類型)時才有意義,但是我們沒有告訴 C++ 它是,而 C++ 就假定它不是。要想轉變這個形勢,我們必須告訴 C++ C::const_iterator 是一個 type(類型)。我們將 typename 放在緊挨著它的前面來做到這一點:
template<typename C> // this is valid C++
void print2nd(const C& container)
{
if (container.size() >= 2) {
typename C::const_iterator iter(container.begin());

}
}
  通用的規(guī)則很簡單:在你涉及到一個在 template(模板)中的 nested dependent type name(嵌套依賴類型名)的任何時候,你必須把單詞 typename 放在緊挨著它的前面。(重申一下,我待會兒要描述一個例外。)

  typename 應該僅僅被用于標識 nested dependent type name(嵌套依賴類型名);其它名字不應該用它。例如,這是一個取得一個 container(容器)和這個 container(容器)中的一個 iterator(迭代器)的 function template(函數模板):
template<typename C> // typename allowed (as is "class")
void f(const C& container, // typename not allowed
typename C::iterator iter); // typename required
  C 不是一個 nested dependent type name(嵌套依賴類型名)(它不是嵌套在依賴于一個 template parameter(模板參數)的什么東西內部的),所以在聲明 container 時它不必被 typename 前置,但是 C::iterator 是一個 nested dependent type name(嵌套依賴類型名),所以它必需被 typename 前置。

  "typename must precede nested dependent type names"(“typename 必須前置于嵌套依賴類型名”)規(guī)則的例外是 typename 不必前置于在一個 list of base classes(基類列表)中的或者在一個 member initialization list(成員初始化列表)中作為一個 base classes identifier(基類標識符)的 nested dependent type name(嵌套依賴類型名)。例如:
template<typename T>
class Derived: public Base<T>::Nested { 
 
// base class list: typename not
 public// allowed
  explicit Derived(int x)
  : Base
<T>::Nested(x) // base class identifier in mem
  { 
   
// init. list: typename not allowed
 
   typename Base
<T>::Nested temp; // use of nested dependent type
    // name not in a base class list or
  } // as a base class identifier in a
   // mem. init. list: typename required
};
  這樣的矛盾很令人討厭,但是一旦你在經歷中獲得一點經驗,你幾乎不會在意它。

  讓我們來看最后一個 typename 的例子,因為它在你看到的真實代碼中具有代表性。假設我們在寫一個取得一個 iterator(迭代器)的 function template(函數模板),而且我們要做一個 iterator(迭代器)指向的 object(對象)的局部拷貝 temp,我們可以這樣做:
template<typename IterT>
void workWithIterator(IterT iter)
{
 typename std::iterator_traits
<IterT>::value_type temp(*iter);
 
}
  不要讓 std::iterator_traits<IterT>::value_type 嚇倒你。那僅僅是一個 standard traits class(標準特性類)的使用,用 C++ 的說法就是 "the type of thing pointed to by objects of type IterT"(“被類型為 IterT 的對象所指向的東西的類型”)。這個語句聲明了一個與 IterT objects 所指向的東西類型相同的 local variable(局部變量)(temp),而且用 iter 所指向的 object(對象)對 temp 進行了初始化。如果 IterT 是 vector<int>::iterator,temp 就是 int 類型。如果 IterT 是 list<string>::iterator,temp 就是 string 類型。因為 std::iterator_traits<IterT>::value_type 是一個 nested dependent type name(嵌套依賴類型名)(value_type 嵌套在 iterator_traits<IterT> 內部,而且 IterT 是一個 template parameter(模板參數)),我們必須讓它被 typename 前置。

  如果你覺得讀 std::iterator_traits<IterT>::value_type 令人討厭,就想象那個與它相同的東西來代表它。如果你像大多數程序員,對多次輸入它感到恐懼,那么你就需要創(chuàng)建一個 typedef。對于像 value_type 這樣的 traits member names(特性成員名),一個通用的慣例是 typedef name 與 traits member name 相同,所以這樣的一個 local typedef 通常定義成這樣:
template<typename IterT>
void workWithIterator(IterT iter)
{
 typedef typename std::iterator_traits
<IterT>::value_type value_type;

 value_type temp(
*iter);
 
}
  很多程序員最初發(fā)現 "typedef typename" 并列不太和諧,但它是涉及 nested dependent type names(嵌套依賴類型名)規(guī)則的一個合理的附帶結果。你會相當快地習慣它。你畢竟有著強大的動機。你輸入 typename std::iterator_traits<IterT>::value_type 需要多少時間?

  作為結束語,我應該提及編譯器與編譯器之間對圍繞 typename 的規(guī)則的執(zhí)行情況的不同。一些編譯器接受必需 typename 時它卻缺失的代碼;一些編譯器接受不許 typename 時它卻存在的代碼;還有少數的(通常是老舊的)會拒絕 typename 出現在它必需出現的地方。這就意味著 typename 和 nested dependent type names(嵌套依賴類型名)的交互作用會導致一些輕微的可移植性問題。

  Things to Remember

  ·在聲明 template parameters(模板參數)時,class 和 typename 是可互換的。

  ·用 typename 去標識 nested dependent type names(嵌套依賴類型名),在 base class lists(基類列表)中或在一個 member initialization list(成員初始化列表)中作為一個 base class identifier(基類標識符)時除外。

posted @ 2007-04-16 15:27 安帛偉 閱讀(464) | 評論 (0)編輯 收藏

為了使用hash_map,今天下載了STLport,在VC6下編譯成功。

1. STLport下載:http://www.stlport.org/
      我下載的是最新版  02.25.07: STLport 5.1.2 released

2. STLport編譯:
      我的STLport目錄是:D:\STLport-5.1.2
      先設置一下VC6下的環(huán)境變量:C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
     把D:\STLport-5.1.2\stlport;加入Include路徑中;把D:\STLport-5.1.2\lib;加入Lib路徑中
      在命令行窗口下:
      運行VCVARS32.BAT,然后
      cd D:\STLport-5.1.2\build\lib
      configure -c msvc6
      nmake /fmsvc.mak install
      編譯全部用的默認選項,因此編譯出來的是多線程靜態(tài)鏈接庫。庫文件被拷貝到D:\STLport-5.1.2\lib

3. 在VC6中使用STLport:
      Tools->Options...->Directories中
      include設置中添加目錄:D:\STLport-5.1.2\stlport
      library設置中添加目錄:D:\STLport-5.1.2\lib
      Project->Settings...->C/C++中
      Category選擇Code Generation,然后在use run-time library中選擇Debug Multithreaded。(如果是release版本,選擇Multithreaded;如果想用動態(tài)鏈接,則要先編譯動態(tài)鏈接版本的STLport,再在這兒選擇相應的DLL)

4. hash_map的例子:
#include <iostream>
#include 
<hash_map>
#include 
<string>

using namespace std;

int main()
{
    hash_map
<intstring> mymap;
    mymap[
2008]="VC6";
    mymap[
999999]="STLport";
    mymap[
123456]="hello hash_map!";
    hash_map
<intstring>::iterator iter = mymap.find(123456);
    
if(iter != mymap.end())
    
{
        cout
<<iter->second<<endl;
    }

    
return 0;
}

posted @ 2007-04-16 14:22 安帛偉 閱讀(8482) | 評論 (21)編輯 收藏

現在在 Visual C++ Toolkit 2003 的主頁上,下載鏈接已經被去掉,轉而勸告人們使用 Visual C++ 2005 Express。
VCToolkitSetup.exe

下載

http://xona.com/programs/VCToolkitSetup%28v1.01%29%282004.07.06%29.zip
MD5: 90D8B963CA196AA9855B2CA6C3174C14
posted @ 2007-04-13 17:05 安帛偉 閱讀(4366) | 評論 (6)編輯 收藏

我們在編寫應用程序的時候explicit關鍵字基本上是很少使用,它的作用是"禁止單參數構造函數"被用于自動型別轉換,其中比較典型的例子就是容器類型,在這種類型的構造函數中你可以將初始長度作為參數傳遞給構造函數.
例如:
你可以聲明這樣一個構造函數

class Array
{
public:
 
explicit Array(int size);
 
//
}
;
在這里explicit關鍵字起著至關重要的作用,如果沒有這個關鍵字的話,這個構造函數有能力將int轉換成Array.一旦這種情況發(fā)生,你可以給Array支派一個整數值而不會引起任何的問題,比如:
Array arr;
//
arr = 40;
此時,C++的自動型別轉換會把40轉換成擁有40個元素的Array,并且指派給arr變量,這個結果根本就不是我們想要的結果.如果我們將構造函數聲明為explicit,上面的賦值操作就會導致編譯器報錯,使我們可以及時發(fā)現錯誤.
需要注意的是:explicit同樣也能阻止"以賦值語法進行帶有轉型操作的初始化";
例如:
Array arr(40);//正確
Array arr = 40;//錯誤 
看一下以下兩種操作:
X x;
Y y(x);
//顯式類型轉換
另一種
X x;
Y y 
= x;//隱式類型轉換
這兩種操作存在一個小小的差別,第一種方式式通過顯式類型轉換,根據型別x產生了型別Y的新對象;第二種方式通過隱式轉換產生了一個型別Y的新對象.
explicit關鍵字的應用主要就是上面所說的構造函數定義中,參考該關鍵字的應用可以看看STL源代碼,其中大量使用了該關鍵字
posted @ 2007-04-12 11:09 安帛偉 閱讀(409) | 評論 (0)編輯 收藏

關鍵字mutable是C++中一個不常用的關鍵字,他只能用于類的非靜態(tài)和非常量數據成員
我們知道一個對象的狀態(tài)由該對象的非靜態(tài)數據成員決定,所以隨著數據成員的改變,
對像的狀態(tài)也會隨之發(fā)生變化!
如果一個類的成員函數被聲明為const類型,表示該函數不會改變對象的狀態(tài),也就是
該函數不會修改類的非靜態(tài)數據成員.但是有些時候需要在該類函數中對類的數據成員
進行賦值.這個時候就需要用到mutable關鍵字了

例如:

class Demo
{
public:
    Demo()
{}
    
~Demo(){}
public:
    
bool getFlag() const
    
{
        m_nAccess
++;
        
return m_bFlag;
    }

private:
    
int  m_nAccess;
    
bool m_bFlag;
}


int main()
{
    
return 0;
}
 


編譯上面的代碼會出現 error C2166: l-value specifies const object的錯誤
說明在const類型的函數中改變了類的非靜態(tài)數據成員.

這個時候需要使用mutable來修飾一下要在const成員函數中改變的非靜態(tài)數據成員
m_nAccess,代碼如下:

class Demo
{
public:
    Demo()
{}
    
~Demo(){}
public:
    
bool getFlag() const
    
{
        m_nAccess
++;
        
return m_bFlag;
    }

private:
    mutable 
int  m_nAccess;
    
bool m_bFlag;
}


int main()
{
    
return 0;
}
 

這樣再重新編譯的時候就不會出現錯誤了!
posted @ 2007-04-12 10:50 安帛偉 閱讀(337) | 評論 (0)編輯 收藏

工廠方法和抽象工廠實際上是從不同角度在描述問題。
工廠方法描述了具體產品的創(chuàng)建,而抽象工廠描述的是產品系列的組織。

// ?Computer.cpp?:?Defines?the?entry?point?for?the?console?application.
//

#include?
" stdafx.h "
#include?
< string >
#include?
< iostream >

using ? namespace ?std;

class ?Ram {} ;
class ?IBMRam:? public ?Ram {} ;
class ?HPRam:? public ?Ram {} ;
class ?Cpu {} ;
class ?IBMCpu:? public ?Cpu {} ;
class ?HPCpu:? public ?Cpu {} ;

class ?Computer
{
public :
?Computer(
string ?strName,?Ram * ?pRam,?Cpu * ?pCpu)
?
{
??m_strName?
= ?strName;
??m_pRam?
= ?pRam;
??m_pCpu?
= ?pCpu;
??cout
<< " A? " << ?m_strName? << " ?computer?is?produced " << endl;
?}

?
~ Computer()
?
{
??delete?m_pRam;
??delete?m_pCpu;
??cout
<< " A? " << ?m_strName? << " ?computer?is?deleted " << endl;
?}

public :
?
string ?m_strName;
private :
?Ram
* ?m_pRam;
?Cpu
* ?m_pCpu;
}
;

class ?ComputerProducer
{
public :
?Computer
* ?createComputer()
?
{
??
return ? new ?Computer(setName(),?createRam(),?createCpu());
?}

?
virtual ?Ram * ?createRam()? = ? 0 ;
?
virtual ?Cpu * ?createCpu()? = ? 0 ;
?
virtual ? string ?setName()? = ? 0 ;
}
;

class ?IBMProducer:? public ?ComputerProducer
{
public :
?
virtual ?Ram * ?createRam()
?
{
??cout
<< " A?IBMRam?is?producted " << endl;
??
return ? new ?IBMRam;
?}

?
virtual ?Cpu * ?createCpu()
?
{
??cout
<< " A?IBMCPU?is?producted " << endl;
??
return ? new ?IBMCpu;
?}

?
virtual ? string ?setName()
?
{
??
return ? string ( " IBM " );
?}

}
;

class ?HPProducer:? public ?ComputerProducer
{
public :
?
virtual ?Ram * ?createRam()
?
{
??cout
<< " A?HPRam?is?producted " << endl;
??
return ? new ?HPRam;
?}

?
virtual ?Cpu * ?createCpu()
?
{
??cout
<< " A?HPCPU?is?producted " << endl;
??
return ? new ?HPCpu;
?}

?
virtual ? string ?setName()
?
{
??
return ? string ( " HP " );
?}

}
;

int ?main( int ?argc,? char * ?argv[])
{
?
// ?client?code
?ComputerProducer * ?pIBMFac = ? new ?IBMProducer;
?ComputerProducer
* ?pHPFac? = ? new ?HPProducer;
?Computer
* ?pIBMComputer? = ?pIBMFac -> createComputer();
?Computer
* ?pHPComputer? = ?pHPFac? -> createComputer();
?delete?pIBMComputer;
?delete?pHPComputer;
?delete?pIBMFac;
?delete?pHPFac;
?
return ? 0 ;
}


這個例子比較清楚了,不同的工廠生產不同的計算機,但計算機的基本組成(這里假設計算機僅由ram和cpu組成)是一樣的,這樣的產品系列很適合用抽象工廠來組織。
而在實際生產計算機的時候,createRam()和createCpu()這兩個工廠方法又起到了作用。

posted @ 2007-03-25 23:20 安帛偉 閱讀(1132) | 評論 (0)編輯 收藏

僅列出標題
共3頁: 1 2 3 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩三级| 欧美成人中文字幕| 久久精品国产999大香线蕉| 一区二区三区国产盗摄| 欧美精品成人| 国产精品麻豆va在线播放| 日韩视频第一页| 亚洲免费中文字幕| 韩国三级在线一区| 欧美成人激情视频免费观看| 亚洲一区二区av电影| 国产日韩欧美综合一区| 免费日韩精品中文字幕视频在线| 亚洲夜间福利| 噜噜噜91成人网| 欧美韩国日本综合| 久久久欧美精品| 在线亚洲成人| 亚洲成人在线网站| 国产精品任我爽爆在线播放| 日韩一区二区精品视频| 一本久久a久久免费精品不卡| 老司机久久99久久精品播放免费| 一本色道久久综合| 狠狠综合久久av一区二区小说| 国产精品久久久久久久久借妻| 欧美成人a视频| 国产精品一区免费在线观看| 欧美婷婷久久| 欧美三级欧美一级| 欧美日韩亚洲国产一区| 久久久久久久久久久久久女国产乱| 一区二区三区精品| 久久精品道一区二区三区| 欧美一区二区播放| 在线视频精品一区| 一本色道久久综合亚洲精品不卡| 在线 亚洲欧美在线综合一区| 国产精品免费看久久久香蕉| 国产美女一区二区| 久久久www成人免费精品| 美女91精品| 国产精品国产a级| 1769国产精品| 久久国产精品久久精品国产| 99精品免费| 免费av成人在线| 国产精品视频99| 亚洲精品久久久久中文字幕欢迎你| 欧美一区二区啪啪| 国产精品99久久久久久有的能看 | 久久精品二区三区| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲视频免费观看| 影音先锋另类| 国产精品尤物| 亚洲欧美一区在线| 99精品欧美| 欧美日韩亚洲视频| 国产精品99久久久久久www| 欧美国产日本韩| 老妇喷水一区二区三区| 亚洲电影欧美电影有声小说| 久久综合福利| 久久综合伊人77777麻豆| 雨宫琴音一区二区在线| 欧美96在线丨欧| 牛牛精品成人免费视频| 狠狠操狠狠色综合网| 久久久久一区二区三区四区| 久久久www成人免费精品| 亚洲电影免费| 亚洲精品美女在线| 久久久噜噜噜久久| 亚洲激情在线| 欧美韩国日本一区| 欧美成年人网| 一区二区高清| 性欧美xxxx大乳国产app| 伊人婷婷久久| 亚洲精选视频在线| 国产精品久久久久秋霞鲁丝| 羞羞漫画18久久大片| 亚洲香蕉视频| 国产欧美一区二区精品仙草咪 | 免费不卡在线观看| 欧美大片va欧美在线播放| 在线一区二区三区四区五区| 一本大道久久a久久精品综合| 国产欧美一区二区三区国产幕精品| 久久在线免费观看视频| 欧美日韩国产91| 久久av在线看| 欧美黑人国产人伦爽爽爽| 午夜精品美女久久久久av福利| 久久久久久免费| 宅男噜噜噜66国产日韩在线观看| 亚洲午夜久久久久久久久电影网| 国内精品伊人久久久久av一坑| 欧美激情精品久久久久久蜜臀 | 性欧美精品高清| 亚洲日本成人| 午夜精品久久久久久久久| 亚洲日韩中文字幕在线播放| 亚洲欧美国产精品专区久久| 亚洲国产精品久久久久秋霞蜜臀 | 国产午夜精品福利| 欧美激情精品久久久久久久变态| 欧美午夜无遮挡| 毛片一区二区三区| 欧美国产亚洲视频| 久久久久久一区二区三区| 欧美日韩日本国产亚洲在线| 久久久久久午夜| 欧美视频一二三区| 欧美14一18处毛片| 国产美女精品人人做人人爽| 亚洲电影免费在线| 国产精品夜色7777狼人| 亚洲欧洲日产国产网站| 伊人成人在线视频| 性欧美激情精品| 欧美在线免费视频| 国产精品一区二区三区成人| 亚洲免费av片| 亚洲精品中文字幕在线| 久久免费黄色| 欧美凹凸一区二区三区视频| 激情综合久久| 久久久久久91香蕉国产| 久久人人97超碰精品888 | 国产精品免费观看在线| 日韩一区二区高清| 亚洲素人在线| 欧美日韩视频在线一区二区观看视频| 亚洲成色最大综合在线| 亚洲国产精品一区二区久| 久久夜色精品一区| 欧美成人精品三级在线观看| 亚洲国产成人在线播放| 久久综合久久综合久久综合| 久久精品一本| 韩国欧美一区| 免费国产一区二区| 免费在线看成人av| 亚洲区一区二区三区| 你懂的视频一区二区| 欧美韩日一区| 亚洲一二三四区| 国产亚洲精品aa午夜观看| 亚洲欧美日产图| 久久久av网站| 亚洲国产一区二区视频| 欧美精品www在线观看| 亚洲国产一区二区三区在线播| 亚洲高清免费视频| 欧美另类综合| 一本久久综合亚洲鲁鲁| 亚洲欧美精品在线观看| 国内外成人免费激情在线视频网站 | 欧美一区二区三区喷汁尤物| 国产中文一区二区三区| 久久久久91| 亚洲国产一区视频| 亚洲欧美精品在线| 国产欧美精品在线| 麻豆成人小视频| 亚洲精选一区二区| 亚洲欧美综合精品久久成人| 国产视频一区三区| 欧美成人亚洲成人日韩成人| 欧美精品一区二区三| 亚洲精品一区二区三区樱花| 亚洲天堂偷拍| 国产在线观看精品一区二区三区| 免费观看不卡av| 亚洲伊人伊色伊影伊综合网| 久久久蜜桃精品| 亚洲精品国产品国语在线app| 国产精品丝袜xxxxxxx| 久久激情婷婷| 日韩亚洲一区二区| 久久精品国产亚洲高清剧情介绍| 亚洲国产一区二区三区在线播 | 亚洲大胆视频| 久久久久久久高潮| 午夜精品一区二区三区在线| 亚洲人成网站在线观看播放| 国产伦精品一区二区三区高清版 | 欧美成人在线影院| 久久久伊人欧美| 亚洲欧美日韩国产精品| 亚洲精品免费在线| 在线观看成人av| 国产三级精品三级| 国产精品乱码妇女bbbb| 欧美久久电影| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美高清在线观看| 久久香蕉国产线看观看网|