亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深度探究C++中的函數重載的用法

2020-05-23 14:10:01
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++中的函數重載用法,包括重載時參數類型的差異以及匹配和轉換等方面問題的講解,需要的朋友可以參考下
 

C++ 允許同一范圍內具有相同名稱的多個函數的規(guī)范。這些函數稱為重載函數,“重載”中對其進行了詳細介紹。利用重載函數,程序員可以根據參數的類型和數量為函數提供不同的語義。
例如,采用字符串(或 char *)參數的 print 函數執(zhí)行的任務與采用“雙精度”類型的參數的函數執(zhí)行的任務截然不同。重載允許通用命名并使程序員無需創(chuàng)建名稱,例如 print_sz 或 print_d。下表顯示了 C++ 使用函數聲明的哪些部分來區(qū)分同一范圍內具有相同名稱的函數組。
重載注意事項

函數聲明元素 是否用于重載?
函數返回類型 No
參數的數量
參數的類型
省略號存在或缺失
typedef 名稱的使用
未指定的數組邊界
const 或 volatile(見下文)

雖然可以根據返回類型區(qū)分函數,但是無法在此基礎上對它們進行重載。僅當 Const 或 volatile 在類中用于應用于類的 this 指針(而不是函數的返回類型)時,它們才用作重載的基礎。換言之,僅當 const 或 volatile 關鍵字遵循聲明中函數的參數列表時,重載才適用。
以下示例闡述如何使用重載。

 

// function_overloading.cpp// compile with: /EHsc#include <iostream>#include <math.h>// Prototype three print functions.int print( char *s );         // Print a string.int print( double dvalue );      // Print a double.int print( double dvalue, int prec ); // Print a double with a// given precision.using namespace std;int main( int argc, char *argv[] ){const double d = 893094.2987;if( argc < 2 )  {// These calls to print invoke print( char *s ).print( "This program requires one argument." );print( "The argument specifies the number of" );print( "digits precision for the second number" );print( "printed." );exit(0);  }// Invoke print( double dvalue ).print( d );// Invoke print( double dvalue, int prec ).print( d, atoi( argv[1] ) );}// Print a string.int print( char *s ){cout << s << endl;return cout.good();}// Print a double in default precision.int print( double dvalue ){cout << dvalue << endl;return cout.good();}// Print a double in specified precision.// Positive numbers for precision indicate how many digits// precision after the decimal point to show. Negative// numbers for precision indicate where to round the number// to the left of the decimal point.int print( double dvalue, int prec ){// Use table-lookup for rounding/truncation.static const double rgPow10[] = { 10E-7, 10E-6, 10E-5, 10E-4, 10E-3, 10E-2, 10E-1, 10E0,10E1, 10E2, 10E3, 10E4, 10E5, 10E6  };const int iPowZero = 6;// If precision out of range, just print the number.if( prec < -6 || prec > 7 )return print( dvalue );// Scale, truncate, then rescale.dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *rgPow10[iPowZero - prec];cout << dvalue << endl;return cout.good();}

前面的代碼演示了文件范圍內的 print 函數重載。
默認參數不被視為函數類型的一部分。因此,它不用于選擇重載函數。僅在默認參數上存在差異的兩個函數被視為多個定義而不是重載函數。
不能為重載運算符提供默認參數。
參數匹配
選擇重載函數以實現當前范圍內的函數聲明與函數調用中提供的參數的最佳匹配。如果找到合適的函數,則調用該函數。此上下文中的“Suitable”具有下列含義之一:

  • 找到完全匹配項。
  • 已執(zhí)行不重要的轉換。
  • 已執(zhí)行整型提升。
  • 已存在到所需參數類型的標準轉換。
  • 已存在到所需參數類型的用戶定義的轉換(轉換運算符或構造函數)。
  • 已找到省略號所表示的參數。

編譯器為每個參數創(chuàng)建一組候選函數。候選函數是這樣一種函數,其中的實參可以轉換為形參的類型。

為每個參數生成一組“最佳匹配函數”,并且所選函數是所有集的交集。如果交集包含多個函數,則重載是不明確的并會生成錯誤。對于至少一個參數而言,最終選擇的函數始終是比組中的所有其他函數更好的匹配項。如果不是這樣(如果沒有清晰的勝者),則函數調用會生成錯誤。
考慮下面的聲明(針對下面的討論中的標識,將函數標記為 Variant 1、Variant 2 和 Variant 3):

Fraction &Add( Fraction &f, long l );    // Variant 1Fraction &Add( long l, Fraction &f );    // Variant 2Fraction &Add( Fraction &f, Fraction &f ); // Variant 3Fraction F1, F2;

請考慮下列語句:

F1 = Add( F2, 23 );

前面的語句生成兩個集:

集 1:其第一個參數的類型為 Fraction 的候選函數 集 2:其第二個參數可轉換為類型 int 的候選函數
Variant 1 Variant 1(可使用標準轉換將 int 轉換為 long)
Variant 3  

集 2 中的函數是具有從實參類型到形參類型的隱式轉換的函數,在這些函數中,有一種函數的從實參類型到其形參類型的轉換的“成本”是最低的。
這兩個集的交集為 Variant 1。不明確的函數調用的示例為:

 

F1 = Add( 3, 6 );

前面的函數調用生成以下集:

集 1:其第一個參數的類型為 int 的候選函數 集 2:其第二個參數的類型為 int 的候選函數
Variant 2(可使用標準轉換將 int 轉換為 long) Variant 1(可使用標準轉換將 int 轉換為 long)

請注意,這兩個集之間的交集為空。因此,編譯器會生成錯誤消息。
對于參數匹配,具有 n 個默認參數的函數將視為 n+1 個單獨函數,并且每個函數均具有不同數量的參數。
省略號 (...) 用作通配符;它與任何實參匹配。如果您未極其謹慎地設計重載函數集,這可能導致產生許多不明確的集。
注意
重載函數的多義性無法確定,直到遇到函數調用。此時,將為函數調用中的每個參數生成集,并且可以確定是否存在明確的重載。這意味著,多義性可保持在您的代碼中,直到它們由特定函數調用引發(fā)。
參數類型差異
重載函數區(qū)分使用不同的初始值設定項的參數類型。因此,對于重載而言,給定類型的參數和對該類型的引用將視為相同。由于它們采用相同的初始值設定項,因此它們被視為是相同的。例如,max( double, double ) 被視為與 max( double &, double & ) 相同。聲明兩個此類函數會導致錯誤。
出于同一原因,對由 const 或 volatile 修改的類型的函數參數(出于重載的目的)的處理方式與基類沒有什么不同。
但是,函數重載機制可以區(qū)分由 const 和 volatile 限定的引用和對基類型的引用。此方法可以編寫諸如以下內容的代碼:

 

// argument_type_differences.cpp// compile with: /EHsc /W3// C4521 expected#include <iostream>using namespace std;class Over {public:  Over() { cout << "Over default constructor/n"; }  Over( Over &o ) { cout << "Over&/n"; }  Over( const Over &co ) { cout << "const Over&/n"; }  Over( volatile Over &vo ) { cout << "volatile Over&/n"; }};int main() {  Over o1;      // Calls default constructor.  Over o2( o1 );   // Calls Over( Over& ).  const Over o3;   // Calls default constructor.  Over o4( o3 );   // Calls Over( const Over& ).  volatile Over o5;  // Calls default constructor.  Over o6( o5 );   // Calls Over( volatile Over& ).}

輸出

Over default constructorOver&Over default constructorconst Over&Over default constructorvolatile Over&

指向 const 和 volatile 對象的指針也被認為和指向基類型的指針(以重載為目的)不同。
參數匹配和轉換
當編譯器嘗試根據函數聲明中的參數匹配實際參數時,如果未找到任何確切匹配項,它可以提供標準轉換或用戶定義的轉換來獲取正確類型。轉換的應用程序受這些規(guī)則的限制:
不考慮包含多個用戶定義的轉換的轉換序列。
不考慮可通過刪除中間轉換來縮短的轉換序列。
最終的轉換序列(如果有)稱為最佳匹配序列。可通過多種方式使用標準轉換將類型 int 的對象轉換為類型unsigned long 的對象(如標準轉換中所述):

  • 從 int 轉換為 long,然后從 long 轉換為 unsigned long。
  • 從 int 轉換為 unsigned long。

第一個序列(盡管它實現了所需目標)不是最佳匹配序列 - 存在一個較短的序列。

下表顯示了一組稱為常用轉換的轉換,這些轉換對確定哪個序列是最佳匹配項有一定的限制。該表后面的列表中討論了常用轉換影響序列選擇的實例。
常用轉換

從類型轉換 轉換為類型
type-name type-name &
type-name & type-name
type-name [ ] type-name*
type-name ( argument-list ) ( *type-name ) ( argument-list )
type-name const type-name
type-name volatile type-name
type-name* const type-name*
type-name* volatile type-name*

在其中嘗試轉換的序列如下:
完全匹配。用于調用函數的類型與函數原型中聲明的類型之間的完全匹配始終是最佳匹配。常用轉換的序列將歸類為完全匹配。但是,不進行任何轉換的序列被視為比進行轉換的序列更佳:

 

  • 從指針,到指向 const(type* 指向 consttype*)的指針。
  • 從指針,到指向 volatile(type* 指向 volatiletype*)的指針。
  • 從引用,到對 const(type & 到 const type &)的引用。
  • 從引用,到對 volatile(type & 到 volatile type &)的引用。

使用提升的匹配。未歸類為僅包含整型提升、從 float 到 double 的轉換以及常用轉換的完全匹配的任何序列將被歸類為使用提升的匹配。盡管比不上完全匹配,但使用提升的匹配仍優(yōu)于使用標準轉換的匹配。

使用標準轉換的匹配。未歸類為完全匹配或僅包含標準轉換和常用轉換的使用提升的匹配的序列將歸類為使用標準轉換的匹配。在此類別中,以下規(guī)則將適用:
從指向派生類的指針到指向直接或間接基類的指針的轉換優(yōu)于到 void * 或 const void * 的轉換。
從指向派生類的指針到指向基類的指針的轉換會產生一個到直接基類的更好匹配。假定類層次結構如下圖所示。

深度探究C++中的函數重載的用法

演示首選轉換的關系圖
從 D* 類型到 C* 類型的轉換優(yōu)于從 D* 類型到 B* 類型的轉換。同樣,從 D* 類型到 B* 類型的轉換優(yōu)于從 D* 類型到 A* 類型的轉換。
此同一規(guī)則適用于引用轉換。從 D& 類型到 C& 類型的轉換優(yōu)于從 D& 類型到 B& 類型的轉換等。
此同一規(guī)則適用于指向成員的指針轉換。從 T D::* 類型到 T C::* 類型的轉換優(yōu)于從 T D::* 類型到 T B::* 類型的轉換等(其中,T 是該成員的類型)。
前面的規(guī)則僅沿派生的給定路徑應用??紤]下圖中顯示的關系圖。

深度探究C++中的函數重載的用法

演示首選轉換的多繼承關系圖
從 C* 類型到 B* 類型的轉換優(yōu)于從 C* 類型到 A* 類型的轉換。原因是它們位于同一個路徑上,且 B* 更為接近。但是,從 C* 類型到 D* 類型的轉換不優(yōu)于到 A* 類型的轉換;沒有首選項,因為這些轉換遵循不同的路徑。
使用用戶定義的轉換的匹配。此序列不能歸類為完全匹配、使用提升的匹配或使用標準轉換的匹配。序列必須僅包含用戶定義的轉換、標準轉換或要歸類為使用用戶定義的轉換的匹配的常用轉換。使用用戶定義的轉換的匹配被認為優(yōu)于使用省略號的匹配,但比不上使用標準轉換的匹配。
使用省略號的匹配。與聲明中的省略號匹配的任何序列將歸類為使用省略號的匹配。這被視為最弱匹配。
如果內置提升或轉換不存在,則用戶定義的轉換將適用?;趯⑵ヅ涞膮档念愋瓦x擇這些轉換??紤]下列代碼:

// argument_matching1.cppclass UDC{public:  operator int()  {   return 0;  }  operator long();};void Print( int i ){};UDC udc;int main(){  Print( udc );}

類 UDC 的可用的用戶定義的轉換來自 int 類型和 long 類型。因此,編譯器會考慮針對將匹配的對象類型的轉換:UDC。到 int 的轉換已存在且已被選中。
在匹配參數的過程中,標準轉換可應用于參數和用戶定義的轉換的結果。因此,下面的代碼將適用:

void LogToFile( long l );...UDC udc;LogToFile( udc );

在前面的示例中,將調用用戶定義的轉換 operator long 以將 udc 轉換為類型 long。如果未定義到 long 類型的用戶定義的轉換,則按如下所示繼續(xù)轉換:使用用戶定義的轉換將 UDC 類型轉換為 int 類型。將應用從 int 類型到 long 類型的標準轉換以匹配聲明中的參數。
如果需要任何用戶定義的轉換來匹配參數,則在計算最佳匹配時不會使用標準轉換。即使多個候選函數需要用戶定義的轉換也是如此;在這種情況下,這些函數被認為是相等的。例如:

// argument_matching2.cpp// C2668 expectedclass UDC1{public:  UDC1( int ); // User-defined conversion from int.};class UDC2{public:  UDC2( long ); // User-defined conversion from long.};void Func( UDC1 );void Func( UDC2 );int main(){  Func( 1 );}

Func 的兩個版本都需要用戶定義的轉換以將類型 int 轉換為類類型參數。可能的轉換包括:

  • 從 int 類型轉換到 UDC1 類型(用戶定義的轉換)。
  • 從 int 類型轉換到 long 類型;然后轉換為 UDC2 類型(一個兩步轉換)。

即使其中的第二個轉換需要標準轉換以及用戶定義的轉換,這兩個轉換仍被視為相等。

注意
用戶定義的轉換被認為是通過構造函數的轉換或通過初始化的轉換(轉換函數)。在考慮最佳匹配時,兩個方法被認為是相等的。
參數匹配和 this 指針
處理類成員函數的方式各不相同,具體取決于它們是否已被聲明為 static。由于非靜態(tài)函數具有提供 this 指針的隱式參數,因此將非靜態(tài)函數視為比靜態(tài)函數多一個參數;否則,將以相同的方式聲明這些函數。
這些非靜態(tài)成員函數要求隱含的 this 指針與通過其調用函數的對象類型匹配,或者對于重載運算符,它們要求第一個參數與該運算符應用于的對象匹配。

與重載函數中的其他參數不同,當嘗試匹配 this 指針參數時,不會引入臨時對象,且不會嘗試轉換。
當 – > 成員選擇運算符用于訪問成員函數時,this 指針參數具有 class-name* const 的類型。如果將成員聲明為 const 或 volatile,則類型分別為 const class-name* const 和 volatile class-name * const。
. 成員選擇運算符以相同的方式工作,只不過隱式 & (address-of) 運算符將成為對象名稱的前綴。下面的示例演示了此工作原理:

// Expression encountered in codeobj.name// How the compiler treats it(&obj)->name

處理 –>* 和 .*(指向成員的指針)運算符的左操作數的方式與處理與參數匹配相關的 . 和 –>(成員選擇)運算符的方式相同。
限制
多個限制管理可接受的重載函數集:

  • 重載函數集內的任意兩個函數必須具有不同的參數列表。
  • 僅基于返回類型重載具有相同類型的參數列表的函數是錯誤的。

不能只根據一個靜態(tài)類型和一個非靜態(tài)類型來重載成員函數。
typedef 聲明不定義新類型;它們引入現有類型的同義詞。它們不影響重載機制??紤]下列代碼:

typedef char * PSTR;void Print( char *szToPrint );void Print( PSTR szToPrint );

前面的兩個函數具有相同的參數列表。 PSTR 是類型 char * 的同義詞。在成員范圍內,此代碼生成錯誤。
枚舉類型是不同的類型,并且可用于區(qū)分重載函數。
就區(qū)分重載函數而言,類型“array of”和“pointer to”是等效的。此情況僅適用于單維度數組。因此,以下重載函數會發(fā)生沖突并生成錯誤消息:

void Print( char *szToPrint );void Print( char szToPrint[] );

對于多維數組,第二個和后續(xù)維度被視為類型的一部分。因此,它們可用來區(qū)分重載函數:

void Print( char szToPrint[] );void Print( char szToPrint[][7] );void Print( char szToPrint[][9][42] );

聲明匹配
同一范圍內具有同一名稱的任何兩個函數聲明都可以引用同一函數或重載的兩個不同的函數。如果聲明的參數列表包含等效類型的參數(如上一節(jié)所述),函數聲明將引用同一函數。否則,它們將引用使用重載選擇的兩個不同的函數。
需要嚴格遵守類范圍;因此,在基類中聲明的函數與在派生類中聲明的函數不在同一范圍內。如果使用與基類中的函數相同的名稱聲明派生類中的函數,則該派生類函數會隱藏基類函數,而不是導致重載。
需要嚴格遵守塊范圍;因此,在文件范圍中聲明的函數與在本地聲明的函數不在同一范圍內。如果在本地聲明的函數與在文件范圍中聲明的函數具有相同名稱,則在本地聲明的函數將隱藏文件范圍內的函數而不是導致重載。例如:

// declaration_matching1.cpp// compile with: /EHsc#include <iostream>using namespace std;void func( int i ){  cout << "Called file-scoped func : " << i << endl;}void func( char *sz ){  cout << "Called locally declared func : " << sz << endl;}int main(){  // Declare func local to main.  extern void func( char *sz );  func( 3 );  // C2664 Error. func( int ) is hidden.  func( "s" );}

前面的代碼顯示函數 func 中的兩個定義。由于 char * 語句,采用 main 類型的參數的定義是 extern 的本地定義。因此,采用 int 類型的參數的定義被隱藏,而對 func 的第一次調用出錯。
對于重載的成員函數,不同版本的函數可能獲得不同的訪問權限。它們仍被視為在封閉類的范圍內,因此是重載函數。請考慮下面的代碼,其中的成員函數 Deposit 將重載;一個版本是公共的,另一個版本是私有的。
此示例的目的是提供一個 Account 類,其中需要正確的密碼來執(zhí)行存款。使用重載可完成此操作。
請注意,對 Deposit 中的 Account::Deposit 的調用將調用私有成員函數。此調用是正確的,因為 Account::Deposit 是成員函數,因而可以訪問類的私有成員。

// declaration_matching2.cppclass Account{public:  Account()  {  }  double Deposit( double dAmount, char *szPassword );private:  double Deposit( double dAmount )  {   return 0.0;  }  int Validate( char *szPassword )  {   return 0;  }};int main(){  // Allocate a new object of type Account.  Account *pAcct = new Account;  // Deposit $57.22. Error: calls a private function.  // pAcct->Deposit( 57.22 );  // Deposit $57.22 and supply a password. OK: calls a  // public function.  pAcct->Deposit( 52.77, "pswd" );}double Account::Deposit( double dAmount, char *szPassword ){  if ( Validate( szPassword ) )   return Deposit( dAmount );  else   return 0.0;}

 



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
久久91精品久久久久久秒播| 欧美日韩免费一区二区| 中文字幕网站在线观看| 精品少妇theporn| 国产一级18片视频| 影音先锋黄色资源| 国产麻豆精品一区二区| 国精产品99永久一区一区| 欧美视频久久久| 欧美一区二区三区人| 在线播放精品| 青青草成人免费在线视频| 国产精品视频免费在线| 嘿咻视频在线看| 精品久久久久av影院| 欧美三级电影在线播放| 99热在线免费观看| 青青久久av| 国产精品夜色7777狼人| 久热久热免费视频中文字幕777| 女性女同性aⅴ免费观女性恋| 亚洲午夜一区二区| 九九九九热精品免费视频| 三级精品视频| 欧美日韩国产123| 韩国日本不卡在线| 国产精品对白一区二区三区| 探花国产精品| 国产成人一二片| 无遮挡又色又刺激的女人视频| 国产精品原创巨作av| 国产精品偷伦一区二区| 懂色av蜜臀av粉嫩av永久| 97se综合| 亚洲一区二区中文字幕| 精品欧美乱码久久久久久1区2区| 亚洲人成精品久久久久| 九色精品国产蝌蚪| 992tv成人免费观看| 欧美久久一区二区| 日韩香蕉视频| 日韩精品免费在线观看| 亚洲永久精品免费| 在线电影一区| 亚洲黄色小视频在线观看| 欧美一级二级三级| 最新热久久免费视频| 国产精品美乳在线观看| 国模gogo一区二区大胆私拍| 欧美性受极品xxxx喷水| 成人小视频在线观看免费| 136国产福利精品导航网址应用| av毛片在线| zjzjzjzjzj亚洲女人| 调教+趴+乳夹+国产+精品| 久久亚洲影视婷婷| 在线成人黄色| 国产成人极品视频| 免费超爽大片黄| 99热这里只有精品在线| 3atv在线一区二区三区| 伊人久久在线| 国产精品高潮呻吟视频| 91美女片黄在线观看游戏| 亚洲欧美日本一区二区三区| 精品国产户外野外| 无码日韩人妻精品久久蜜桃| 毛片女人与拘交视频| 羞羞色午夜精品一区二区三区| 992tv成人国产福利在线| 国产免费av网站| 男人天堂欧美日韩| 91精品国产自产在线丝袜啪| 免费在线不卡av| 久久精品视频91| 国产精品精品久久久久久| 人人玩人人添人人澡免费| 国产黄色一级网站| 亚洲国产精品黑人久久久| 好久没做在线观看| 中文字幕日韩在线视频| 亚洲无毛电影| 18videosex性欧美麻豆| 伊人www22综合色| 成人国产亚洲精品a区天堂华泰| 亚洲成人网在线播放| 国产精品美女久久久久久2018| 91精品国产综合久久香蕉的特点| 亚洲一区二区四区| 国产福利不卡| 国产95在线|亚洲| a黄色片在线观看| 污污视频网站在线免费观看| 欧美jizz18| 日本不卡123| 试看120秒一区二区三区| 天天爽夜夜爽夜夜爽| 亚洲一区二区三区高清视频| 含羞草www国产在线视频| 中文字幕日韩专区| 九九精品在线视频| 中文字幕人成人乱码亚洲电影| 刘亦菲毛片一区二区三区| 亚洲电影观看| 三级中文字幕在线观看| 色吊丝av中文字幕| 亚洲综合一区二区精品导航| 精品国产乱码久久久久| 黑料不打烊so导航| 2019国产精品自在线拍国产不卡| 亚洲AV无码国产精品| 亚洲最新av在线网站| **三级三级97片毛片| 日本视频一二三区中文字幕| 婷婷丁香激情综合| 免费中国女人69xxxxx视频| 18岁免费网站| 国产稀缺精品盗摄盗拍| 97精品高清一区二区三区| 中文字幕第一页在线视频| 亚洲最大在线视频| 日韩中文字幕区一区有砖一区| 亚洲黄网站在线观看| 国产精品网站在线观看| 精品国产精品国产精品| 欧美日韩国内自拍| 久久精品国产96久久久香蕉| 男插女视频久久久| 成人福利免费观看| 欧美,日韩,国产在线| 免费啪视频在线观看| 精品人妻一区二区三区四区| 自拍偷拍一区二区三区四区| 影音先锋中文在线视频| 欧美gv在线观看| 中文字幕视频在线播放| 成人在线小视频| 欧美成人久久| 免费观看成人av| 欧美一二三不卡| 亚洲精品1区2区3区| 999精品国产| 日韩经典中文字幕在线观看| 先锋欧美三级| 最近2019年中文视频免费在线观看| 小早川怜子痴女在线精品视频| 久国产精品视频| a级一a一级在线观看| 欧美tickling挠脚心丨vk| 久久这里只有精品9| 国产精品白丝jk黑袜喷水| 黄动漫网站在线观看| 91麻豆成人精品国产| 韩国三级与黑人| 欧美老女人性生活视频| 99久久亚洲国产日韩美女| 99在线精品视频免费观看20| 第一社区sis001原创亚洲| 精品视频日韩| 亚洲先锋影音| 色偷偷亚洲第一成人综合网址| 97在线视频免费观看完整版| 欧美丰满艳妇bbwbbw| 久久亚洲人体| 日本成人中文字幕在线| 爱爱爱爱免费视频| 久久99精品波多结衣一区| 欧美激情一区| 久久久久久免费精品| 992kp免费看片| 欧美五级在线观看视频播放| 亚洲天堂久久久久| gay视频丨vk| 老司机午夜av| 亚洲女优在线| 99久久夜色精品国产亚洲| 国产精品户外野外| 136国产福利精品导航网址| 在线中文字幕亚洲| 欧美美女日韩| 男人天堂va| 亚洲精品男人天堂| 水蜜桃亚洲精品| 变态调教一区二区三区| 亚洲欧美日韩国产一区二区三区| 久久天堂国产精品| 老鸭窝一区二区| 免费久久99精品国产自在现线| ts人妖交友网站| 一本久道久久综合狠狠爱亚洲精品| 欧美xxxx黑人又粗又长密月| 久久电影视频| 亚洲美女精品成人在线视频| 女同一区二区| 97超碰人人爽| 亚洲自拍偷拍网址| 国产精品视频网站在线观看| 亚洲欧美中文字幕在线一区| 国产亚洲精品综合一区91| 水蜜桃免费高清视频在线播放| 99国产精品久久久久久久成人热| 涩涩视频网站在线观看| 天堂在线一区二区| 国产乡下妇女做爰视频| 国产精品一级片| 国产亚洲精品久久久久久久| 成人av色网站| 五月天天在线| 欧美大片日本大片免费观看| 欧美在线观看视频| 爱福利在线视频| 91中文精品字幕在线视频| 欧美激情亚洲激情| 久久99久久99精品免视看婷婷| 色播色播色播色播色播在线| 北条麻妃在线一区| 国产成a人亚洲精| 伊人久久大香线蕉综合热线| 99这里都是精品| av网站免费在线播放| 91视视频在线观看入口直接观看www| 中文字幕+乱码+中文字幕明步| 轻轻草成人在线| 在线天堂资源www在线污| 国产精品论坛| 欧美成人dvd在线视频| 国产亚洲精品精品精品| 欧美成人网在线| 日本福利小视频| 欧美四级剧情无删版影片| 艳妇臀荡乳欲伦亚洲一区| 午夜av在线播放| 色av中文字幕| 日韩欧美在线免费观看| 亚洲欧美国产精品久久久久久久| a看欧美黄色女同性恋| 五月天婷婷激情视频| 激情网站在线观看| 青青草免费观看免费视频在线| www.三级.com| www.尤物.com| 91免费在线播放视频| 久本草在线中文字幕亚洲| 日韩精品视频一区二区在线观看| 国产清纯白嫩初高中在线观看性色| 91tv国产成人福利| 久久亚洲电影天堂| 国产精品高清无码在线观看| 亚洲精品午夜国产va久久成人| 免费福利视频一区二区三区| 国产成人欧美在线观看| av成人app永久免费| 欧洲精品视频在线观看| 成av人电影在线观看| 欧美精品videosex牲欧美| 亚洲综合日韩欧美| 国产成人8x视频一区二区| 久久久久亚洲AV成人无码国产| 国产区在线观看| 欧美做爰性欧美大fennong| 欧美视频专区一二在线观看| 亚洲国产精品传媒在线观看| 国产av无码专区亚洲av麻豆| 99久久久精品免费观看国产| 欧美人与物videos另类xxxxx| 视频一区国产精品| 色视频在线观看在线播放| 国产精品丝袜久久久久久app| 神马久久影视大全| 亚洲视频一二三四| 国产乱淫av片杨贵妃| 美日韩黄色大片| 亚洲成人av资源网| 视频区小说区图片区| 我要看一级黄色大片| 三级久久三级久久久| 欧美另类视频| 国产精品成人免费一区久久羞羞| 久草在线资源视频在线观看| 精品久久久中文字幕人妻| 亚洲国产精品久久久久蝴蝶传媒| 欧美性xxxxxx| 激情丁香综合| 久久久999成人| 亚洲精品视频在线观看免费视频| 亚洲黄色在线网站| 99久久亚洲一区二区三区青草| 99re6这里只有精品| 无码人妻丰满熟妇区五十路百度| 日韩亚洲国产欧美| 中文字幕2022永久在线| 婷婷六月天丁香| 三上悠亚激情av一区二区三区| 看av免费毛片手机播放| 国产成人精品日本亚洲11| 日韩av色在线| 久久网福利资源网站| 久久久噜噜噜久久中文字幕色伊伊| 偷偷要 色偷偷| 免费看污片的网站| 中文字幕不卡| 污污免费在线观看| 亚洲综合激情六月婷婷在线观看| 给我免费观看片在线电影的| 美女扒开尿口让男人操亚洲视频网站| 国产h色视频在线观看| 侵犯稚嫩小箩莉h文系列小说| 成人在线观看小视频| 性色av一区二区三区在线观看| 丝袜美腿精品国产二区| 日韩高清在线观看一区二区| 国产主播一区二区| 毛片视频网站在线观看| 少妇人妻丰满做爰xxx| 日韩高清在线免费观看| 制服丝袜影音| 中文字幕久久久久久久| 四季av综合网站| 亚洲人精选亚洲人成在线| av永久免费观看| 视频国产在线观看| 高清成人在线观看| 外国精品视频在线观看| 亚洲一区二区三区在线免费| 91精品欧美福利在线观看| 国产精品久久久免费视频| 国产精品伦一区| 羞羞漫画网18久久app|