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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C++ FAQ Lite[13]--算符重載(新)

2019-09-10 09:07:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

[13] 算符重載
(Part of C++ FAQ Lite, Copyright © 1991-2001, Marshall Cline, cline@parashift.com)

簡(jiǎn)體中文版翻譯:申?F,nicrosoft@sunistudio.com(東日制作室,東日文檔)


FAQs in section [13]:

  • [13.1] 算符重載的作用是什么?
  • [13.2] 算符重載的好處是什么?
  • [13.3] 有什么算符重載的實(shí)例?  
  • [13.4] 但是算符重載使得我的類(lèi)很丑陋;難道它不是應(yīng)該使我的類(lèi)更清晰嗎?
  • [13.5] 什么算符能/不能被重載?
  • [13.6] 我能重載 operator== 以便比較兩個(gè) char[] 來(lái)進(jìn)行字符串比較嗎?  
  • [13.7] 我能為“冪”運(yùn)算創(chuàng)建一個(gè) operator** 嗎?
  • [13.8] 如何為Matrix(矩陣)類(lèi)創(chuàng)建下標(biāo)運(yùn)算符?  
  • [13.9] 為什么Matrix(矩陣)類(lèi)的接口不應(yīng)該象數(shù)組的數(shù)組?
  • [13.10] 該從外(接口優(yōu)先)還是從內(nèi)(數(shù)據(jù)優(yōu)先)設(shè)計(jì)類(lèi)?  

 


 

[13.1] 算符重載的作用是什么?

 

它允許你為類(lèi)的用戶提供一個(gè)直覺(jué)的接口。 算符重載允許C/C++的運(yùn)算符在用戶定義類(lèi)型(類(lèi))上擁有一個(gè)用戶定義的意義。重載的算符是函數(shù)調(diào)用的語(yǔ)法修飾:  

class Fred {
public:
 
// ...
};

#if 0

 
// 沒(méi)有算符重載:
  Fred add(Fred, Fred);
  Fred mul(Fred, Fred);

  Fred f(Fred a, Fred b, Fred c)
  {
    return add(add(mul(a,b), mul(b,c)), mul(c,a));    
// 哈哈,多可笑...
  }

#else

 
// 有算符重載:
  Fred operator+ (Fred, Fred);
  Fred operator* (Fred, Fred);

  Fred f(Fred a, Fred b, Fred c)
  {
    return a*b + b*c + c*a;
  }

#endif

[ Top | Bottom | Previous section | Next section ]

 

[13.2] 算符重載的好處是什么?

 

通過(guò)重載類(lèi)上的標(biāo)準(zhǔn)算符,你可以發(fā)掘類(lèi)的用戶的直覺(jué)。使得用戶程序所用的語(yǔ)言是面向問(wèn)題的,而不是面向機(jī)器的。 最終目標(biāo)是降低學(xué)習(xí)曲線并減少錯(cuò)誤率。 [ Top | Bottom | Previous section | Next section ]

 

[13.3] 有什么算符重載的實(shí)例?

 

[Recently changed so it uses the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.] 這里有一些算符重載的實(shí)例:
  • myString + yourString 可以連接兩個(gè) std::string 對(duì)象
  • myDate++ 可以增加一個(gè) Date 對(duì)象
  • a * b 可以將兩個(gè) Number 對(duì)象相乘
  • a 可以訪問(wèn) Array 對(duì)象的某個(gè)元素
  • x = *p 可以反引用一個(gè)實(shí)際“指向”一個(gè)磁盤(pán)記錄的 "smart pointer" 它實(shí)際上在磁盤(pán)上定位到 p 所指向的記錄并返回給x。  
[ Top | Bottom | Previous section | Next section ]

 

[13.4] 但是算符重載使得我的類(lèi)很丑陋;難道它不是應(yīng)該使我的類(lèi)更清晰嗎?

 

算符重載使得類(lèi)的用戶的工作更簡(jiǎn)易,而不是為類(lèi)的開(kāi)發(fā)者服務(wù)的! 考慮一下如下的例子:

class Array {
public:
  int& operator[] (unsigned i);      
// 有些人不喜歡這種語(yǔ)法
  // ...
};

inline
int& Array::operator[] (unsigned i)  
// 有些人不喜歡這種語(yǔ)法
{
 
// ...
}

有些人不喜歡operator關(guān)鍵字或類(lèi)體內(nèi)的有些古怪的語(yǔ)法。但是算符重載語(yǔ)法不是被期望用來(lái)使得類(lèi)的開(kāi)發(fā)者的工作更簡(jiǎn)易。它被期望用來(lái)使得類(lèi)的用戶的工作更簡(jiǎn)易:  

int main()
{
  Array a;
  a[3] = 4;  
// 用戶代碼應(yīng)該明顯而且易懂...
}

記住:在一個(gè)面向重用的世界中,使用你的類(lèi)的人有很多,而建造它的人只有一個(gè)(你自己);因此你做任何事都應(yīng)該照顧多數(shù)而不是少數(shù)。 [ Top | Bottom | Previous section | Next section ]

 

[13.5] 什么算符能/不能被重載?

 

大多數(shù)都可以被重載。C的算符中只有 . ? :(以及sizeof,技術(shù)上可以看作一個(gè)算符)。C++增加了一些自己的算符,除了::.*,大多數(shù)都可以被重載。 這是一個(gè)下標(biāo)算符的示例(它返回一個(gè)引用)。先沒(méi)有算符重載:

class Array {
public:
  int& elem(unsigned i)/t{ if (i > 99) error(); return data; }
private:
  int data[100];
};

int main()
{
  Array a;
  a.elem(10) = 42;
  a.elem(12) += a.elem(13);
}

現(xiàn)在用算符重載給出同樣的邏輯:

class Array {
public:
  int& operator[] (unsigned i) { if (i > 99) error(); return data; }
private:
  int data[100];
};

int main()
{
  Array a;
  a[10] = 42;
  a[12] += a[13];
}

[ Top | Bottom | Previous section | Next section ]

 

[13.6] 我能重載 operator== 以便比較兩個(gè) char[] 來(lái)進(jìn)行字符串比較嗎?

 

[Recently changed so it uses the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.] 不行:被重載的算符,至少一個(gè)操作數(shù)必須是用戶定義類(lèi)型(大多數(shù)時(shí)候是類(lèi))。 但即使C++允許,也不要這樣做。因?yàn)樵诖颂幠銘?yīng)該使用類(lèi)似 std::string的類(lèi)而不是字符數(shù)組,因?yàn)閿?shù)組是有害的。因此無(wú)論如何你都不會(huì)想那樣做的。 [ Top | Bottom | Previous section | Next section ]

 

[13.7] 我能為“冪”運(yùn)算創(chuàng)建一個(gè) operator** 嗎?

 

不行。 運(yùn)算符的名稱、優(yōu)先級(jí)、結(jié)合性以及元數(shù)都是由語(yǔ)言固定的。在C++中沒(méi)有operator**,因此你不能為類(lèi)類(lèi)型創(chuàng)建它。 如果還有疑問(wèn),考慮一下x ** yx * (*y)等同(換句話說(shuō),編譯器假定 y 是一個(gè)指針)。此外,算符重載只不過(guò)是函數(shù)調(diào)用的語(yǔ)法修飾。雖然這種特殊的語(yǔ)法修飾非常美妙,但它沒(méi)有增加任何本質(zhì)的東西。我建議你重載pow(base,exponent)(雙精度版本在<cmath>中)。 順便提一下,operator^可以成為冪運(yùn)算,只是優(yōu)先級(jí)和結(jié)合性是錯(cuò)誤的。 [ Top | Bottom | Previous section | Next section ]

 

[13.8] 如何為Matrix矩陣)類(lèi)創(chuàng)建下標(biāo)運(yùn)算符?

 

[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]operator()而不是operator[]。 當(dāng)有多個(gè)下標(biāo)時(shí),最清晰的方式是使用operator()而不是operator[]。原因是operator[]總是帶一個(gè)參數(shù),而operator()可以帶任何數(shù)目的參數(shù)(在矩形的矩陣情況下,需要兩個(gè)參數(shù))。 如:

class Matrix {
public:
  Matrix(unsigned rows, unsigned cols);
  double& operator() (unsigned row, unsigned col);
  double  operator() (unsigned row, unsigned col) const;
 
// ...
 ~Matrix();/t/t/t      // 析構(gòu)函數(shù)
  Matrix(const Matrix& m);/t       // 拷貝構(gòu)造函數(shù)
  Matrix& operator= (const Matrix& m);   // 賦值算符
  // ...
private:
  unsigned rows_, cols_;
  double* data_;
};

inline
Matrix::Matrix(unsigned rows, unsigned cols)
  : rows_ (rows),
    cols_ (cols),
    data_ (new double[rows * cols])
{
  if (rows == 0 || cols == 0)
    throw BadIndex("Matrix constructor has 0 size");
}

inline
Matrix::~Matrix()
{
  delete[] data_;
}

inline
double& Matrix::operator() (unsigned row, unsigned col)
{
  if (row >= rows_ || col >= cols_)
    throw BadIndex("Matrix subscript out of bounds");
  return data_[cols_*row + col];
}

inline
double Matrix::operator() (unsigned row, unsigned col) const
{
  if (row >= rows_ || col >= cols_)
    throw BadIndex("const Matrix subscript out of bounds");
  return data_[cols_*row + col];
}

然后,你可以使用m(i,j)來(lái)訪問(wèn)Matrix m 的元素,而不是m[j]:

int main()
{
  Matrix m(10,10);
  m(5,8) = 106.15;
  std::cout << m(5,8);
 
// ...
}

[ Top | Bottom | Previous section | Next section ]

 

[13.9] 為什么Matrix(矩陣)類(lèi)的接口不應(yīng)該象數(shù)組的數(shù)組?

 

本 FAQ 其實(shí)是關(guān)于:某些人建立的Matrix 類(lèi),帶有一個(gè)返回 Array 對(duì)象的引用的operator[]。而該Array 對(duì)象也帶有一個(gè) operator[] ,它返回Matrix的一個(gè)元素(例如,一個(gè)double的引用)。因此,他們使用類(lèi)似m[j] 的語(yǔ)法來(lái)訪問(wèn)矩陣的元素,而不是象m(i,j)的語(yǔ)法。 數(shù)組的數(shù)組方案顯然可以工作,但相對(duì)于operator()方法來(lái)說(shuō),缺乏靈活性。尤其是,用[][]方法很難表現(xiàn)的時(shí)候,用operator()方法可以很簡(jiǎn)單的完成,因此[][]方法很可能導(dǎo)致差勁的表現(xiàn),至少某些情況細(xì)是這樣的。 例如,實(shí)現(xiàn)[][]方法的最簡(jiǎn)單途徑就是使用作為密集矩陣的,以以行為主的形式保存(或以列為主,我記不清了)的物理布局。相反,operator() 方法完全隱藏了矩陣的物理布局,在這種情況下,它可能帶來(lái)更好的表現(xiàn)。 可以這么認(rèn)為:operator()方法永遠(yuǎn)不比[][]方法差,有時(shí)更好。
  • operator() 永遠(yuǎn)不差,是因?yàn)橛?tt>operator()方法實(shí)現(xiàn)以行為主的密集矩陣的物理布局非常容易。因此,當(dāng)從性能觀點(diǎn)出發(fā),那樣的結(jié)構(gòu)正好是最佳布局時(shí),operator()方法也和[][]方法一樣簡(jiǎn)單(也許operator()方法更容易一點(diǎn)點(diǎn),但我不想夸大其詞)。
  • operator() 方法有時(shí)更好,是因?yàn)楫?dāng)對(duì)于給定的應(yīng)用,有其它比以行為主的密集矩陣更好的布局時(shí),用 operator() 方法比[][]方法實(shí)現(xiàn)會(huì)容易得多。
作為一個(gè)物理布局使得實(shí)現(xiàn)困難的例子,最近的項(xiàng)目發(fā)生在以列訪問(wèn)矩陣元素(也就是,算法訪問(wèn)一列中的所有元素,然后是另一列等),如果物理布局是以行為主的,對(duì)矩陣的訪問(wèn)可能會(huì)“cache失效”。例如,如果行的大小幾乎和處理器的cache大小相當(dāng),那么對(duì)每個(gè)元素的訪問(wèn),都會(huì)發(fā)生“cache不命中”。在這個(gè)特殊的項(xiàng)目中,我們通過(guò)將映射從邏輯布局(行,列)變?yōu)槲锢聿季郑?,行),性能得到?0%的提升。 當(dāng)然,還有很多這類(lèi)事情的例子,而稀疏矩陣在這個(gè)問(wèn)題中則是又一類(lèi)例子。通常,使用operator()方法實(shí)現(xiàn)一個(gè)稀疏矩陣或交換行/列順序更容易,operator()方法不會(huì)損失什么,而可能獲得一些東西它不會(huì)更差,卻可能更好。 使用 operator() 方法。 [ Top | Bottom | Previous section | Next section ]

 

[13.10] 該從外(接口優(yōu)先)還是從內(nèi)(數(shù)據(jù)優(yōu)先)設(shè)計(jì)類(lèi)?

 

[Recently changed so it uses new-style headers and the std:: syntax and reworded references to STL (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.] 從外部! 良好的接口提供了一個(gè)簡(jiǎn)化的,以用戶詞匯表達(dá)的視圖。在面向?qū)ο筌浖那闆r下,接口通常是單個(gè)類(lèi)或一組緊密結(jié)合的類(lèi)的public方法的集合. 首先考慮對(duì)象的邏輯特征是什么,而不是打算如何創(chuàng)建它。例如,假設(shè)要?jiǎng)?chuàng)建一個(gè)Stack(棧)類(lèi),其包含一個(gè) LinkedList:  

class Stack {
public:
 
// ...
private:
  LinkedList list_;
};

Stack是否應(yīng)該有一個(gè)返回LinkedListget()方法?或者一個(gè)帶有LinkedListset()方法?或者一個(gè)帶有LinkedList的構(gòu)造函數(shù)?顯然,答案是“不”,因?yàn)閼?yīng)該從外向里設(shè)計(jì)接口。也就是說(shuō),Stack對(duì)象的用戶并不關(guān)心 LinkedList;他們只關(guān)心 pushing 和 popping。 現(xiàn)在看另一個(gè)更微妙的例子。假設(shè) LinkedList類(lèi)使用Node對(duì)象的鏈表來(lái)創(chuàng)建,每一個(gè)Node對(duì)象有一個(gè)指向下一個(gè)Node的指針:  

class Node { /*...*/ };

class LinkedList {
public:
 
// ...
private:
  Node* first_;
};

LinkedList類(lèi)是否應(yīng)該有一個(gè)讓用戶訪問(wèn)第一個(gè)Nodeget()方法?Node 對(duì)象是否應(yīng)該有一個(gè)讓用戶訪問(wèn)鏈中下一個(gè) Node get()方法?換句話說(shuō),從外部看,LinkedList應(yīng)該是什么樣的?LinkedList 是否實(shí)際上就是一個(gè) Node 對(duì)象的鏈?或者這些只是實(shí)現(xiàn)的細(xì)節(jié)?如果只是實(shí)現(xiàn)的細(xì)節(jié),LinkedList 將如何讓用戶在某時(shí)刻訪問(wèn) LinkedList 中的每一個(gè)元素? 某人的回答:LinkedList 不是的 Node 鏈。它可能的確是用  Node 創(chuàng)建的,但這不是本質(zhì)。它的本質(zhì)是元素的序列。因此,LinkedList 抽象應(yīng)該提供一個(gè)“LinkedListIterator”,并且“LinkedListIterator”應(yīng)該有一個(gè)operator++ 來(lái)訪問(wèn)下一個(gè)元素,并且有一對(duì)get()/set()來(lái)訪問(wèn)存儲(chǔ)于Node 的值(Node 元素中的值只由LinkedList用戶負(fù)責(zé),因此有一對(duì)get()/set()以允許用戶自由地維護(hù)該值)。 從用戶的觀點(diǎn)出發(fā),我們可能希望 LinkedList類(lèi)支持看上去類(lèi)似使用指針?biāo)惴ㄔL問(wèn)數(shù)組的算符:  

void userCode(LinkedList& a)
{
  for (LinkedListIterator p = a.begin(); p != a.end(); ++p)
    std::cout << *p << '';
}

實(shí)現(xiàn)這個(gè)接口,LinkedList需要一個(gè) begin()方法和 end()方法。它們返回一個(gè)“LinkedListIterator”對(duì)象。該“LinkedListIterator”需要一個(gè)前進(jìn)的方法,++p ;訪問(wèn)當(dāng)前元素的方法,*p;和一個(gè)比較算符,p != a.end()。 如下的代碼,關(guān)鍵在于 LinkedList 類(lèi)沒(méi)有任何讓用戶訪問(wèn) Node 的方法。Node 作為實(shí)現(xiàn)技術(shù)被完全地隱藏了。 LinkedList 類(lèi)內(nèi)部可能用雙重鏈表取代,甚至是一個(gè)數(shù)組,區(qū)別僅僅在于一些諸如prepend(elem)append(elem)方法的性能上。

#include <cassert>    // Poor man's exception handling

class LinkedListIterator;
class LinkedList;

class Node {
 
// No public members; this is a "private class"
  friend LinkedListIterator;   // 友員類(lèi)
  friend LinkedList;
  Node* next_;
  int elem_;
};

class LinkedListIterator {
public:
  bool operator== (LinkedListIterator i) const;
  bool operator!= (LinkedListIterator i) const;
  void operator++ ();  
// Go to the next element
  int& operator*  ();   // Access the current element
private:
  LinkedListIterator(Node* p);
  Node* p_;
  friend LinkedList;  
// so LinkedList can construct a LinkedListIterator
};

class LinkedList {
public:
  void append(int elem);    
// Adds elem after the end
  void prepend(int elem);   // Adds elem before the beginning
  // ...
  LinkedListIterator begin();
  LinkedListIterator end();
 
// ...
private:
  Node* first_;
};

這些是顯然可以內(nèi)聯(lián)的方法(可能在同一個(gè)頭文件中):  

inline bool LinkedListIterator::operator== (LinkedListIterator i) const
{
  return p_ == i.p_;
}

inline bool LinkedListIterator::operator!= (LinkedListIterator i) const
{
  return p_ != i.p_;
}

inline void LinkedListIterator::operator++()
{
  assert(p_ != NULL);  
// or if (p_==NULL) throw ...
  p_ = p_->next_;
}

inline int& LinkedListIterator::operator*()
{
  assert(p_ != NULL);  
// or if (p_==NULL) throw ...
  return p_->elem_;
}

inline LinkedListIterator::LinkedListIterator(Node* p)
  : p_(p)
{ }

inline LinkedListIterator LinkedList::begin()
{
  return first_;
}

inline LinkedListIterator LinkedList::end()
{
  return NULL;
}

結(jié)論:鏈表有兩種不同的數(shù)據(jù)。存儲(chǔ)于鏈表中的元素的值由鏈表的用戶負(fù)責(zé)(并且只有用戶負(fù)責(zé),鏈表本身不阻止用戶將第三個(gè)元素變成第五個(gè)),而鏈表底層結(jié)構(gòu)的數(shù)據(jù)(如 next 指針等)值由鏈表負(fù)責(zé)(并且只有鏈表負(fù)責(zé),也就是說(shuō)鏈表不讓用戶改變(甚至看到!)可變的next 指針)。 因此 get()/set() 方法只獲取和設(shè)置鏈表的元素,而不是鏈表的底層結(jié)構(gòu)。由于鏈表隱藏了底層的指針等結(jié)構(gòu),因此它能夠作非常嚴(yán)格的承諾(例如,如果它是雙重鏈表,它可以保證每一個(gè)后向指針都被下一個(gè) Node 的前向指針匹配)。 我們看了這個(gè)例子,類(lèi)的一些數(shù)據(jù)的值由用戶負(fù)責(zé)(這種情況下需要有針對(duì)數(shù)據(jù)的get()/set()方法),但對(duì)于類(lèi)所控制的數(shù)據(jù)則不必有get()/set()方法。 注意:這個(gè)例子的目的不是為了告訴你如何寫(xiě)一個(gè)鏈表類(lèi)。實(shí)際上不要自己做鏈表類(lèi),而應(yīng)該使用編譯器所提供的“容器類(lèi)”的一種。理論上來(lái)說(shuō),要使用標(biāo)準(zhǔn)容器類(lèi)之一,如:std::list<T> 模板。 [ Top | Bottom | Previous section | Next section ]
E-mail the author
[ C++ FAQ Lite | Table of contents | Subject index | About the author | © | Download your own copy ]
Revised Apr 8, 2001

 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

卡通动漫亚洲综合| 欧美一级性视频| 欧美日韩不卡一区| 免费看av的网址| 国产igao激情在线入口| 最近的2019中文字幕免费一页| 夫妻免费无码v看片| 精品乱码一区内射人妻无码| 欧美高清你懂的| 久久亚洲综合国产精品99麻豆精品福利| 日本五十肥熟交尾| 天天看天天操| 手机视频在线观看| 丝袜美腿诱惑一区二区三区| 欧美性猛交xxxx黑人交| 色视频网站在线观看| 视频一区在线观看| 日韩精品一卡二卡三卡四卡无卡| 日韩av在线资源| 中国一级特黄录像播放| 天天操夜夜干| 欧美成人国产精品高潮| 激情五月播播久久久精品| 一区二区三区四区五区视频在线观看| 国产原创一区二区三区| 久久综合久久鬼| 成人免费在线视频网址| 亚洲区免费视频| 欧美激情网址| 女同另类激情重口| 91精品国产91久久久久久密臀| 亚洲人成网在线播放| 亚洲 欧美 视频| 就去色蜜桃综合| 成年网站在线播放| 手机看片1024久久| 国产亚洲第一页| 国产一级片自拍| 全部毛片永久免费看| 欧美精品福利| 性做久久久久久免费观看| 91视频欧美| 在线观看国产免费视频| 国产一区二区三区精品久久久| 天堂视频在线免费观看| 久久激情五月婷婷| 久草视频免费在线播放| 午夜电影福利网| 国产一区二区网址| 性欧美ⅴideo另类hd| 日韩不卡av| 亚洲精品无amm毛片| 欧美影院一区二区三区| 久热精品视频在线| 色噜噜狠狠一区二区三区狼国成人| 久久手机免费视频| 色视频网站在线| 欧美sm美女调教| 欧美一乱一性一交一视频| 清纯唯美一区二区三区| 夜夜爽av福利精品导航| 国产精品久久久久国产精品日日| 男人舔女人下部高潮全视频| 91久久久久久久久久久久久| 久久丫精品久久丫| 色www精品视频在线观看| 91人妻一区二区| 成人在线短视频| 亚洲私拍自拍| 欧美色图天堂网| 国产一二三区av| 青青草娱乐在线| 久久久久一区二区三区| 国产激情视频一区二区在线观看| 精品久久久久久久久久久久| 日韩中文字幕视频| 日本熟女一区二区| 两个人hd高清在线观看| 中文字幕理伦片免费看| 欧美成人综合| 欧美视频自拍偷拍| 9i看片成人免费高清| 亚洲精品自拍区在线观看| 国产精品一品二区三区的使用体验| 一区二区日韩电影| 中国一级片黄色一级片黄| 公肉吊粗大爽色翁浪妇视频| 亚洲欧美另类在线视频| 91日本视频在线| 欧美91精品| 肥女人的一级毛片| 国产超碰在线一区| 色老板视频在线观看| 在线观看免费视频一区二区三区| 日韩精品一区中文字幕| 中文字幕免费在线观看视频| 日本系列第一页| 国产精品第七十二页| 亚洲性无码av在线| 91精品一区二区三区四区| 亚洲欧美日韩国产成人综合一二三区| 精品久久久三级丝袜| 亚洲欧洲自拍| 精品久久久久久亚洲综合网| 欧美黄色性生活| 亚洲国产一区二区在线播放| 国产精品福利在线播放| 国产精品视频播放| **毛片在线网站| 最大av网站| 手机看片国产精品| 精品一区二区三区视频在线观看| 欧美喷水一区二区| 污污的视频在线观看| 影音先锋国产在线| 国产精品久久久久久中文字| 精品调教chinesegay| 性生活在线视频| 老师我好爽再深一点的视频| 午夜剧场成人观在线视频免费观看| 国产又粗又长又爽| 丁香花电影在线观看完整版| 欧美三级电影在线| 在线观看免费小视频| 内射毛片内射国产夫妻| 久久婷婷国产麻豆91天堂| 日本aⅴ免费视频一区二区三区| 青青草娱乐在线| av片在线免费观看| 国产中文欧美精品| 99久久国产综合精品女小说| 亚洲h片在线看| www.国产视频| 奇米影视7777精品一区二区| 日韩av最新在线观看| 久久电影天堂| 中文精品一区二区| 中文字幕先锋av影音资源网| www.久久精品视频| 色啪啪.com| 日本一区二区三区在线免费观看| 青娱乐在线免费视频| 亚洲欧美日韩小说| 中文字幕4区| 日本免费一区二区视频| 日本在线观看不卡| a级黄色片网站| 韩日欧美一区二区三区| 日韩av手机在线播放| 亚洲美女主播视频免费观看| 2023国产一二三区日本精品2022| 久久精品日产第一区二区三区精品版| 亚洲不卡av一区二区三区| 亚洲成人三级| 久久久久久久久毛片| 国产毛片久久久久久久| av一区二区久久| 黄色片视频在线播放| 国产黄页在线观看| 少妇视频一区二区| 最近2019中文字幕第三页视频| 亚洲久色影视| 国产aⅴ精品一区二区三区色成熟| 精品乱码一区内射人妻无码| 免费看成年人视频| 久久久久香蕉视频| 成年人深夜福利| 欧美男人的天堂一二区| 亚洲一区免费在线| 色美美综合视频| 欧美激情性做爰免费视频| 日日夜夜一区| 乱一区二区av| 亚洲免费人成在线视频观看| 在线免费观看一级片| 国产精品久久..4399| 91直播在线观看| 97人人在线| 亚洲国产1区| 国产精品视频一区二区三区麻豆| 欧美成人久久久免费播放| 337p亚洲精品色噜噜狠狠| 色婷婷av一区二区三区软件| 三级在线播放| 男人午夜天堂| 日产亚洲一区二区三区| 欧美午夜片在线免费观看| 神马久久久久久久久| 欧美三区四区| 亚洲欧洲精品一区二区精品久久久| 激情综合五月| 超碰97人人在线| 日本一区二区三区免费乱视频| 成人动漫视频在线| av在线电影院| 日本不卡免费在线视频| 欧美精品一区二区三区高清aⅴ| 国产麻豆视频网站| aaa日本高清在线播放免费观看| 国产精彩视频在线| 男人的天堂视频网站| 日本精品入口免费视频| 日韩一区二区三区在线观看| 综合久久成人| 人成免费电影一二三区在线观看| 欧美性生交大片免网| 精品调教chinesegay| 日韩欧美在线观看免费| 影音先锋中文字幕一区二区| 轻轻操 在线观看| 精品一区二区久久| 久久综合亚洲| 中文字幕一区二区三区四区在线视频| 亚洲三级网址| 国产网站免费在线观看| juy有坂深雪中文字幕| 国产精品69精品一区二区三区| 欧美国产精品中文字幕| 国产丝袜一区二区| 手机看片一区二区| 91亚洲国产成人久久精品麻豆| www操com| 久久久久久久97| 老牛国内精品亚洲成av人片| 意大利激情丛林无删减版dvd| 久久99九九99精品| 日日摸夜夜添夜夜添国产精品| 久久久精品一区二区毛片免费看| heyzo欧美激情| 免费在线亚洲| 人妻丰满熟妇av无码区hd| 亚洲美女屁股眼交| 日韩美女一区二区三区四区| 国产精品美女久久久久久久久| 日韩欧美国产成人精品免费| jlzzjlzz亚洲日本少妇| 日韩精品免费观看视频| 国产小视频国产精品| 97精品视频| 欧美小视频在线观看| 久久久久久久久久久久网站| 风间由美性色一区二区三区四区| 另类专区欧美制服同性| 黄色片视频在线播放| 有码一区二区三区| 激情视频在线观看一区二区三区| 678在线观看视频| 四虎精品永久免费| 久久亚洲春色中文字幕久久久| 免费做暖暖免费观看日本| 涩涩屋黄网站| 午夜成年人在线免费视频| 日日日日人人人夜夜夜2017| 中文字幕久久久av一区| 欧美va在线| 一个色在线综合| 国产在线www| 欧美激情中文网| 久久一卡二卡| 国产精品333| 国产精品视频线看| 午夜久久久精品| 亚洲国产精品中文| 黄色三级视频片| 91免费在线播放| 亚洲制服丝袜在线播放| 国产综合色在线观看| 欧美性猛交丰臀xxxxx网站| 成人情趣视频| 毛片女人与拘交视频| 精品一区二区三区免费看| 亚洲第一成人在线视频| 伦伦影院午夜日韩欧美限制| 欧美中文字幕一区二区三区| 97se狠狠狠综合亚洲狠狠| 亚洲国产精品成人| av网址观看| www国产视频| 丰满人妻一区二区三区免费| 91麻豆产精品久久久久久| 亚洲精品福利在线| 哺乳挤奶一区二区三区免费看| 国产日产精品一区二区三区四区| av不卡在线| 欧美大片免费| 精品视频999| 日韩在线视频在线观看| 91日韩在线专区| 国产精品入口免费视频一| 777久久久精品| 中国一级特黄毛片大片| 日本不卡高清视频| 美女激情网站| www.777色| 一区二区三区视频免费观看| 国产亚洲欧美一区在线观看| 2020国产精品视频| 尤物网站在线| 日韩成人av一区| 37pao成人国产永久免费视频| h视频在线观看免费| 亚洲国产天堂久久综合| 第三区美女视频在线| 日本精品一区二区| 免费精品国产自产拍观看| 国产九色精品成人porny| 国产一区白浆| 天堂av中文在线资源库| 国产精品入口夜色视频大尺度| 国产女主播福利| 久久精品欧美一区二区| 国产精品手机在线观看| 亚洲在线一区二区三区| 国产噜噜噜噜噜久久久久久久久| 精品一区二区三区免费| 2020中文字幕在线播放| 三上悠亚国产精品一区二区三区| 亚洲成a人v欧美综合天堂下载| 亚洲欧美卡通另类91av| 黄色精品一区二区| 狠狠躁少妇一区二区三区| 欧美人与动性xxxxx杂性| 俄罗斯黄色一级片| 98精品久久久久久久| 中文字幕另类日韩欧美亚洲嫩草| 免费观看的av| 四虎视频在线精品免费网址| 亚洲视频每日更新|