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

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

結合C++11的新特性來解析C++中的枚舉與聯(lián)合

2020-05-23 14:10:05
字體:
來源:轉載
供稿:網(wǎng)友
這篇文章主要介紹了C++編程中的枚舉與聯(lián)合,結合了范圍(或強類型)enum class類型等C++11的新特性來講解,需要的朋友可以參考下
 

枚舉
枚舉是用戶定義的類型,其中包含一組稱為枚舉器的命名的整型常數(shù)。
語法

// unscoped enum:enum [identifier] [: type]{enum-list}; // scoped enum:enum [class|struct] [identifier] [: type] {enum-list};// Forward declaration of enumerations (C++11):enum A : int; // non-scoped enum must have type specifiedenum class B; // scoped enum defaults to intenum class C : short;

參數(shù)
identifier
指定給與枚舉的類型名稱。
type
枚舉器的基礎類型;所有枚舉器都具有相同的基礎類型。可能是任何整型。
enum-list
枚舉中以逗號分隔的枚舉器列表。范圍中的每個枚舉器或變量名必須是唯一的。但是,值可以重復。在未區(qū)分范圍的枚舉中,范圍是周邊范圍;在區(qū)分范圍的枚舉中,范圍是 enum-list 本身。
class
可使用聲明中的此關鍵字指定枚舉區(qū)分范圍,并且必須提供 identifier。還可使用 struct 關鍵字來代替 class,因為在此上下文中它們在語義上等效。
備注
枚舉提供上下文來描述以命名常數(shù)表示的一系列值,這些值也稱為枚舉器。在原始 C 和 C++ 枚舉類型中,非限定枚舉器在聲明枚舉的整個范圍中可見。在區(qū)分范圍的枚舉中,枚舉器名稱必須由枚舉類型名稱限定。以下示例演示兩種枚舉之間的基本差異:

namespace CardGame_Scoped{  enum class Suit { Diamonds, Hearts, Clubs, Spades };  void PlayCard(Suit suit)  {    if (suit == Suit::Clubs) // Enumerator must be qualified by enum type    { /*...*/}  }}namespace CardGame_NonScoped{  enum Suit { Diamonds, Hearts, Clubs, Spades };  void PlayCard(Suit suit)  {    if (suit == Clubs) // Enumerator is visible without qualification    { /*...*/    }  }}

將為枚舉中的每個名稱分配一個整數(shù)值,該值與其在枚舉中的順序相對應。默認情況下,為第一個值分配 0,為下一個值分配 1,以此類推,但你可以顯式設置枚舉器的值,如下所示:

enum Suit { Diamonds = 1, Hearts, Clubs, Spades };

為枚舉器 Diamonds 分配值 1。后續(xù)枚舉器接收的值會在前一個枚舉器的值的基礎上加一(如果沒有顯式賦值)。在前面的示例中,Hearts 將具有值 2,Clubs 將具有值 3,依此類推。
每個枚舉器將被視為常數(shù),并且必須在定義 enum 的范圍內(nèi)(對于未區(qū)分圍的枚舉)或在枚舉本身中(對于區(qū)分范圍的枚舉)具有唯一名稱。為這些名稱指定的值不必是唯一的。例如,如果一個未區(qū)分范圍的枚舉 Suit 的聲明如下:

enum Suit { Diamonds = 5, Hearts, Clubs = 4, Spades };

Diamonds、Hearts、Clubs 和 Spades 的值分別是 5、6、4 和 5。請注意,5 使用了多次;盡管這并不符合預期,但是允許的。對于區(qū)分范圍的枚舉來說,這些規(guī)則是相同的。
強制轉換規(guī)則
未區(qū)分范圍的枚舉常數(shù)可以隱式轉換為 int,但是 int 不可以隱式轉換為枚舉值。下面的示例顯示了如果嘗試為 hand 分配一個不是 Suit 的值可能出現(xiàn)的情況:

int account_num = 135692;Suit hand;hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'

將 int 轉換為區(qū)分范圍或未區(qū)分范圍的枚舉器時,需要強制轉換。但是,你可以將區(qū)分范圍的枚舉器提升為整數(shù)值,而不進行強制轉換。

int account_num = Hearts; //OK if Hearts is in a unscoped enum

按照這種方式使用隱式轉換可能導致意外副作用。若要幫助消除與區(qū)分范圍的枚舉相關的編程錯誤,區(qū)分范圍的枚舉值必須是強類型值。區(qū)分范圍的枚舉器必須由枚舉類型名稱(標識符)限定,并且無法進行隱式轉換,如以下示例所示:

namespace ScopedEnumConversions{  enum class Suit { Diamonds, Hearts, Clubs, Spades };  void AttemptConversions()  {    Suit hand;     hand = Clubs; // error C2065: 'Clubs' : undeclared identifier    hand = Suit::Clubs; //Correct.    int account_num = 135692;    hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'    hand = static_cast<Suit>(account_num); // OK, but probably a bug!!!    account_num = Suit::Hearts; // error C2440: '=' : cannot convert from 'Suit' to 'int'    account_num = static_cast<int>(Suit::Hearts); // OK}

注意,hand = account_num; 行仍會導致對未區(qū)分范圍的枚舉發(fā)生的錯誤,如前面所示。它可以與顯式強制轉換一起使用。但是,借助區(qū)分范圍的枚舉,不再允許在沒有顯式強制轉換的情況下在下一條語句 account_num = Suit::Hearts; 中嘗試轉換。

聯(lián)合

union 是用戶定義的類型,其中所有成員都共享同一個內(nèi)存位置。 這意味著在任何給定時間,聯(lián)合都不能包含來自其成員列表的多個對象。 這還意味著無論聯(lián)合具有多少成員,它始終僅使用足以存儲最大成員的內(nèi)存。
具有大量對象和/或內(nèi)存有限時,聯(lián)合可用于節(jié)省內(nèi)存。 但是,需要格外小心才能正確使用它們,因為由你負責確??墒冀K訪問寫入的最后一個成員。 如果任何成員類型具有不常用構造函數(shù),則必須編寫附加代碼來顯式構造和銷毀該成員。 使用聯(lián)合之前,應考慮是否可以使用基類和派生類來更好地表示嘗試解決的問題。

union [name] { member-list };

參數(shù)
name
為聯(lián)合提供的類型名稱。
member-list
聯(lián)合可以包含的成員。 請參閱“備注”。
備注
聲明聯(lián)合
利用 union 關鍵字開始聯(lián)合的聲明,并用大括號包含成員列表:

// declaring_a_union.cppunion RecordType  // Declare a simple union type{  char  ch;  int  i;  long  l;  float f;  double d;  int *int_ptr;}; int main(){  RecordType t;  t.i = 5; // t holds an int  t.f = 7.25 // t now holds a float }

使用聯(lián)合
在前面的示例中,任何訪問聯(lián)合的代碼都需要了解保存數(shù)據(jù)的成員。 此問題最常見的解決方案是將聯(lián)合以及其他枚舉成員(指示當前存儲在聯(lián)合中的數(shù)據(jù)的類型)放入一個結構中。 這稱為可區(qū)分的聯(lián)合,下面的示例演示了基本模式。

#include "stdafx.h"#include <queue>using namespace std;enum class WeatherDataType{  Temperature, Wind};struct TempData{  int StationId;  time_t time;  double current;  double max;  double min;};struct WindData{  int StationId;  time_t time;  int speed;  short direction;};struct Input{  WeatherDataType type;  union  {    TempData temp;    WindData wind;  };};// Functions that are specific to data typesvoid Process_Temp(TempData t) {}void Process_Wind(WindData w) {}// Container for all the data recordsqueue<Input> inputs;void Initialize();int main(int argc, char* argv[]){  Initialize();  while (!inputs.empty())  {    Input i = inputs.front();    switch (i.type)    {    case WeatherDataType::Temperature:      Process_Temp(i.temp);      break;    case WeatherDataType::Wind:      Process_Wind(i.wind);      break;    default:      break;    }    inputs.pop();  }  return 0;}void Initialize(){  Input first, second;  first.type = WeatherDataType::Temperature;  first.temp = { 101, 1418855664, 91.8, 108.5, 67.2 };  inputs.push(first);  second.type = WeatherDataType::Wind;  second.wind = { 204,1418859354, 14, 27 };  inputs.push(second);}

 

 

在前面的示例中,請注意 Input 結構中的聯(lián)合沒有名稱。 這是匿名聯(lián)合,可以訪問其成員,如同它們是結構的直接成員一樣。 有關匿名聯(lián)合的詳細信息,請參閱下面一節(jié)。
當然,上面的示例演示的問題也可以通過以下方法解決:使用派生自公共基類的類,并基于容器中每個對象的運行時類型對代碼進行分支。 這可以生成更易于維護和理解的代碼,但是也可能比使用聯(lián)合更慢。 此外,通過聯(lián)合可以存儲完全不相關的類型,并動態(tài)更改存儲的值的類型,而無需更改聯(lián)合變量本身的類型。 因此可以創(chuàng)建其元素存儲不同類型的不同值的 MyUnionType 異類數(shù)組。
請注意,可能會很容易誤用前面示例中的 Input 結構。 完全由用戶負責正確使用鑒別器來訪問保存數(shù)據(jù)的成員。 你可以通過使聯(lián)合成為專用并提供特殊訪問函數(shù)(如下一個示例所示)來防止誤用。
無限制的聯(lián)合 (C++11)
在 C++03 及更低版本中,聯(lián)合可以包含具有類類型的非靜態(tài)數(shù)據(jù)成員,只要該類型沒有用戶提供的構造函數(shù)、析構函數(shù)或賦值運算符即可。 在 C++11 中,消除了這些限制。 如果在聯(lián)合中包含這樣一個成員,則編譯器會自動將不是用戶提供的任何特殊成員函數(shù)標記為已刪除。 如果聯(lián)合是類或結構中的匿名聯(lián)合,則類或結構的不是用戶提供的任何特殊成員函數(shù)都會標記為已刪除。 下面的示例演示如何處理聯(lián)合的某個成員具有需要此特殊處理的成員的情況:

// for MyVariant#include <crtdbg.h>#include <new>#include <utility>// for sample objects and output#include <string>#include <vector>#include <iostream>using namespace std;struct A {  A() = default;  A(int i, const string& str) : num(i), name(str) {}    int num;  string name;  //...};struct B {  B() = default;  B(int i, const string& str) : num(i), name(str) {}    int num;  string name;  vector<int> vec;  // ...};enum class Kind { None, A, B, Integer };#pragma warning (push)#pragma warning(disable:4624)class MyVariant{public:  MyVariant()    : kind_(Kind::None)  {  }  MyVariant(Kind kind)    : kind_(kind)  {    switch (kind_)    {    case Kind::None:      break;    case Kind::A:      new (&a_) A();      break;    case Kind::B:      new (&b_) B();      break;    case Kind::Integer:      i_ = 0;      break;    default:      _ASSERT(false);      break;    }  }  ~MyVariant()  {    switch (kind_)    {    case Kind::None:      break;    case Kind::A:      a_.~A();      break;    case Kind::B:      b_.~B();      break;    case Kind::Integer:      break;    default:      _ASSERT(false);      break;    }    kind_ = Kind::None;  }  MyVariant(const MyVariant& other)    : kind_(other.kind_)  {    switch (kind_)    {    case Kind::None:      break;    case Kind::A:      new (&a_) A(other.a_);      break;    case Kind::B:      new (&b_) B(other.b_);      break;    case Kind::Integer:      i_ = other.i_;      break;    default:      _ASSERT(false);      break;    }  }  MyVariant(MyVariant&& other)    : kind_(other.kind_)  {    switch (kind_)    {    case Kind::None:      break;    case Kind::A:      new (&a_) A(move(other.a_));      break;    case Kind::B:      new (&b_) B(move(other.b_));      break;    case Kind::Integer:      i_ = other.i_;      break;    default:      _ASSERT(false);      break;    }    other.kind_ = Kind::None;  }  MyVariant& operator=(const MyVariant& other)  {    if (&other != this)    {      switch (other.kind_)      {      case Kind::None:        this->~MyVariant();        break;      case Kind::A:        *this = other.a_;        break;      case Kind::B:        *this = other.b_;        break;      case Kind::Integer:        *this = other.i_;        break;      default:        _ASSERT(false);        break;      }    }    return *this;  }  MyVariant& operator=(MyVariant&& other)  {    _ASSERT(this != &other);    switch (other.kind_)    {    case Kind::None:      this->~MyVariant();      break;    case Kind::A:      *this = move(other.a_);      break;    case Kind::B:      *this = move(other.b_);      break;    case Kind::Integer:      *this = other.i_;      break;    default:      _ASSERT(false);      break;    }    other.kind_ = Kind::None;    return *this;  }  MyVariant(const A& a)    : kind_(Kind::A), a_(a)  {  }  MyVariant(A&& a)    : kind_(Kind::A), a_(move(a))  {  }  MyVariant& operator=(const A& a)  {    if (kind_ != Kind::A)    {      this->~MyVariant();      new (this) MyVariant(a);    }    else    {      a_ = a;    }    return *this;  }  MyVariant& operator=(A&& a)  {    if (kind_ != Kind::A)    {      this->~MyVariant();      new (this) MyVariant(move(a));    }    else    {      a_ = move(a);    }    return *this;  }  MyVariant(const B& b)    : kind_(Kind::B), b_(b)  {  }  MyVariant(B&& b)    : kind_(Kind::B), b_(move(b))  {  }  MyVariant& operator=(const B& b)  {    if (kind_ != Kind::B)    {      this->~MyVariant();      new (this) MyVariant(b);    }    else    {      b_ = b;    }    return *this;  }  MyVariant& operator=(B&& b)  {    if (kind_ != Kind::B)    {      this->~MyVariant();      new (this) MyVariant(move(b));    }    else    {      b_ = move(b);    }    return *this;  }  MyVariant(int i)    : kind_(Kind::Integer), i_(i)  {  }  MyVariant& operator=(int i)  {    if (kind_ != Kind::Integer)    {      this->~MyVariant();      new (this) MyVariant(i);    }    else    {      i_ = i;    }    return *this;  }  Kind GetKind() const  {    return kind_;  }  A& GetA()  {    _ASSERT(kind_ == Kind::A);    return a_;  }  const A& GetA() const  {    _ASSERT(kind_ == Kind::A);    return a_;  }  B& GetB()  {    _ASSERT(kind_ == Kind::B);    return b_;  }  const B& GetB() const  {    _ASSERT(kind_ == Kind::B);    return b_;  }  int& GetInteger()  {    _ASSERT(kind_ == Kind::Integer);    return i_;  }  const int& GetInteger() const  {    _ASSERT(kind_ == Kind::Integer);    return i_;  }private:  Kind kind_;  union  {    A a_;    B b_;    int i_;  };};#pragma warning (pop)int main(){  A a(1, "Hello from A");  B b(2, "Hello from B");  MyVariant mv_1 = a;  cout << "mv_1 = a: " << mv_1.GetA().name << endl;  mv_1 = b;  cout << "mv_1 = b: " << mv_1.GetB().name << endl;  mv_1 = A(3, "hello again from A");  cout << R"aaa(mv_1 = A(3, "hello again from A"): )aaa" << mv_1.GetA().name << endl;  mv_1 = 42;  cout << "mv_1 = 42: " << mv_1.GetInteger() << endl;  b.vec = { 10,20,30,40,50 };  mv_1 = move(b);  cout << "After move, mv_1 = b: vec.size = " << mv_1.GetB().vec.size() << endl;  cout << endl << "Press a letter" << endl;  char c;  cin >> c;}#include <queue>#include <iostream>using namespace std;enum class WeatherDataType{  Temperature, Wind};struct TempData{  TempData() : StationId(""), time(0), current(0), maxTemp(0), minTemp(0) {}  TempData(string id, time_t t, double cur, double max, double min)    : StationId(id), time(t), current(cur), maxTemp(max), minTemp(0) {}  string StationId;  time_t time = 0;  double current;  double maxTemp;  double minTemp;};struct WindData{  int StationId;  time_t time;  int speed;  short direction;};struct Input{  Input() {}  Input(const Input&) {}  ~Input()  {    if (type == WeatherDataType::Temperature)    {      temp.StationId.~string();    }  }  WeatherDataType type;  void SetTemp(const TempData& td)  {    type = WeatherDataType::Temperature;    // must use placement new because of string member!    new(&temp) TempData(td);  }  TempData GetTemp()  {    if (type == WeatherDataType::Temperature)      return temp;    else      throw logic_error("Can't return TempData when Input holds a WindData");  }  void SetWind(WindData wd)  {    // Explicitly delete struct member that has a     // non-trivial constructor    if (type == WeatherDataType::Temperature)    {      temp.StationId.~string();    }    wind = wd; //placement new not required.  }  WindData GetWind()  {    if (type == WeatherDataType::Wind)    {      return wind;    }    else      throw logic_error("Can't return WindData when Input holds a TempData");  }private:  union  {    TempData temp;    WindData wind;  };};

 

聯(lián)合不能存儲引用。 聯(lián)合不支持繼承,因此聯(lián)合本身不能用作基類、繼承自另一個類或具有虛函數(shù)。
初始化聯(lián)合
可以通過指定包含在括號中的表達式來在相同語句中聲明并初始化聯(lián)合。 計算該表達式并將其分配給聯(lián)合的第一個字段。

#include <iostream>using namespace std;union NumericType{  short    iValue;  long    lValue;   double   dValue; };int main(){  union NumericType Values = { 10 };  // iValue = 10  cout << Values.iValue << endl;  Values.dValue = 3.1416;  cout << Values.dValue) << endl;}/* Output: 10 3.141600*/

NumericType 聯(lián)合排列在內(nèi)存中(概念性的),如下圖所示。

結合C++11的新特性來解析C++中的枚舉與聯(lián)合

匿名聯(lián)合
匿名聯(lián)合是聲明的沒有 class-name 或 declarator-list 的聯(lián)合。
union { member-list }
匿名聯(lián)合中聲明的名稱可直接使用,就像非成員變量一樣。 因此,匿名聯(lián)合中聲明的名稱必須在周邊范圍中是唯一的。
除了聯(lián)合成員數(shù)據(jù)中列出的限制之外,匿名聯(lián)合還受其他限制:
如果在文件或命名空間范圍內(nèi)聲明聯(lián)合,則還必須將它們聲明為“靜態(tài)的”。
它們可以只具有公共成員;匿名聯(lián)合中的私有成員和受保護的成員會生成錯誤。
它們不能具有函數(shù)成員。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
夜夜嗨av一区二区三区四区| 国产精品久久久久久久免费| 国产精品国产国产aⅴ| 福利片一区二区三区| 国产午夜精品视频| 先锋资源在线视频| 亚洲免费视频一区二区三区| 一级片视频在线观看| 精品日韩一区二区三区免费视频| 日本国产高清不卡| jizz国产在线观看| 香蕉成人伊视频在线观看| 色播五月激情五月| 久久在线免费观看视频| 国产欧美日韩综合精品一区二区| 国模精品视频| 欧美一区二区三区日韩视频| 久热精品视频在线免费观看| 午夜精品123| 成人国产精品一区二区网站| 日韩欧美久久久| 免费观看四虎精品成人| 国产一区二区三区四区五区加勒比| 国产欧美日韩三级| 草莓视频丝瓜在线观看丝瓜18| 在线视频网站| eeuss影院www在线观看手机| 美女精品久久久| 亚洲小视频网站| 欧美福利视频在线观看| 在线观看视频网站你懂得| 日韩久久一级片| 激情小说亚洲色图| 96sao精品免费视频观看| 国产精品麻豆欧美日韩ww| 成人一区二区在线| 久久久国产精品麻豆| 欧美极品aⅴ影院| 精品不卡一区二区三区| 精品视频在线一区| 欧美一区二区三区久久精品茉莉花| 人人妻人人澡人人爽人人欧美一区| 国产一区二区丝袜| 91看片在线免费观看| 热久久精品免费视频| 不卡专区在线| www.国产视频| 国产精品一区二区三区精品| 欧美1o一11sex性hdhd| 中文字幕亚洲综合久久五月天色无吗''| 伊人久久噜噜噜躁狠狠躁| 在线h片观看| japanese国产在线观看| 国产麻豆入在线观看| 无码人妻精品一区二区三| 少妇光屁股影院| 五月婷婷综合在线观看| 亚洲美女在线观看| 黄页免费在线| 欧美精品在线看| 国产精品在线| 综合久久一区| 国产精品一国产精品最新章节| 91超碰中文字幕久久精品| 亚洲狼人综合干| 国产一区在线观看视频| 久久中文娱乐网| 成年人视频免费看| www.狠狠lu| 欧洲杯半决赛直播| 天堂av免费在线| 羞羞答答国产精品www一本| 亚洲狠狠婷婷| 26uuu日韩精品一区二区| |精品福利一区二区三区| 91九色国产蝌蚪| 欧美va在线观看| 亚洲精品久久久中文字幕| 懂色av蜜桃av| 99在线视频播放| 在线一区二区视频| 国产精品天美传媒入口| xx欧美撒尿嘘撒尿xx| 成人精品网站在线观看| 蜜桃视频在线播放| 偷拍精品一区二区三区| 日本a级c片免费看三区| 国产亚洲一区二区在线观看| 成人福利影视| www.黄色国产| 日本一区精品久久久久影院| 免费成人在线影院| 91久久偷偷做嫩草影院| 欧美日韩综合色| 九色91视频| 成人性做爰aaa片免费看不忠| 91精品久久久久久粉嫩| 午夜精品久久久久久久99水蜜桃| 国产调教视频在线观看| 国内精彩免费自拍视频在线观看网址| 成人午夜视频一区二区播放| 国产精品久久婷婷| 亚洲va国产va欧美va观看| 国产精品免费精品一区| www.蜜桃av| 成人性生交大片免费| 很黄很污的网站| 国产成人avxxxxx在线看| 国产一级久久久| 国产精品吊钟奶在线| 天天爱天天做天天操| 乱熟女高潮一区二区在线| 亚洲国产美女久久久久| 国产盗摄xxxx视频xxx69| 欧美视频第三页| 99久久精品国产毛片| 1069男同网址| 欧美办公室脚交xxxx| 精品视频无码一区二区三区| 19j韩国主播韩宝贝在线| 国产香蕉成人综合精品视频| 国产精品一区二区三区www| 九九热在线视频观看这里只有精品| 欧美成ee人免费视频| 精品一区二区观看| 亚洲精品中文字| 九色精品视频在线观看| 久久久不卡网国产精品一区| 糖心vlog精品一区二区| 中国av一区二区三区| 久久精品亚洲精品国产欧美kt∨| 精品一区二区三区在线播放视频| 麻豆成人91精品二区三区| 欧美激情第一页在线观看| 久草视频在线免费看| 日本黄色片免费观看| 午夜激情综合网| 奇米777欧美一区二区| 天天草夜夜操| 国产盗摄——sm在线视频| 97香蕉久久超级碰碰高清版| 国内欧美视频一区二区| 黄色免费视频观看| 国产精品一线二线三线| 国产精品一区二区久久久| 肉色丝袜一区二区| 91国产视频在线观看| 色久优优欧美色久优优| 91福利区在线观看| 制服.丝袜.亚洲.中文.综合| 精品日本美女福利在线观看| 国模私拍一区二区国模曼安| 免费一级a毛片夜夜看| 精品久久久久久久久久久久久久久久| 国产精品一区二区久激情瑜伽| 久操视频在线| 日韩欧美中文| 欧美色中文字幕| 精精国产xxxx视频在线野外| 91在线观看免费网站| 欧美特级www| 毛片女人与拘交视频| 国产精品久久二区二区| 日本粉色视频在线观看| 国产精品无码人妻一区二区在线| 91福利国产成人精品照片| 黑人巨大精品欧美一区二区免费| 久久国产精品99久久久久久丝袜| 久久66热这里只有精品| 黄色av网址在线播放| 曰韩不卡视频| 国产一区视频在线观看免费| 欧美成va人片在线观看| 天堂资源最新版在线视频观看免费网| 国产精品黄页免费高清在线观看| 天天爽夜夜爽夜夜爽精品| 亚洲区国产区| 欧美高清电影在线看| 清纯粉嫩极品夜夜嗨av| 美女黄色一级视频| 国产自产女人91一区在线观看| av黄色免费网站| 999精品视频在线观看| 精品国产美女a久久9999| 欧美亚洲动漫另类| 中文成人无字幕乱码精品区| 国产一区红桃视频| 久久手机在线视频| 制服丝袜中文字幕在线观看| 日韩免费黄色av| 欧美精品 - 色网| 最新97超碰在线| 国产午夜一区二区三区| 天堂中文在线资源| 亚洲黄色性网站| 国产日产精品_国产精品毛片| 久久黄色免费网站| 国产精品111| 少妇高潮一区二区三区喷水| www.91在线观看| 欧美日韩在线一二三| 欧美人与禽zozzo禽性配| 美女免费视频黄| 久久精品国产精品亚洲精品| 性娇小13――14欧美| 性高潮视频在线观看| 偷拍25位美女撒尿视频在线观看| 国产精品一品视频| www.欧美精品| 国产亚洲激情视频在线| 亚洲欧美日本另类| 日韩pacopacomama| 日本在线观看中文字幕| 99re6热只有精品免费观看| 国产欧美一区二区精品秋霞影院| av先锋下载| 日韩少妇内射免费播放| 久久亚洲人体| av在线影视| 一区二区三区在线观看欧美| 亚洲精品**中文毛片| 欧美久久一二区| 国产精品露脸自拍| 男女免费网站| 在线观看国产成人av片| 欧美韩日一区二区三区| 99精品视频免费版的特色功能| 国产精品旅馆在线| 久久成年人免费电影| 国产精品边吃奶边做爽| 天干天干啦夜天天天视频| 奇米网一区二区| 欧美a级片网站| 在线观看wwwxxxx| 国产成人综合一区| 中文字幕自拍vr一区二区三区| 国产精品乡下勾搭老头1| 亚洲免费一区| 夜夜爽夜夜爽精品视频| 亚洲 欧美 日韩 国产综合 在线| 国产不卡一区二区三区在线观看| 亚洲三级免费| 精品人妻大屁股白浆无码| 中文字幕日韩在线视频| 久久精品magnetxturnbtih| 日本美女爱爱视频| www高清在线视频日韩欧美| 国内揄拍国内精品久久| 妺妺窝人体色777777| 亚洲国产一二三| 日韩av电影手机在线| 成人免费看aa片| 精品国产高清a毛片无毒不卡| 精品日韩电影| 国产特级aaaaaa大片| 日本系列第一页| 91精品中国老女人| 国产免费av一区二区| 97国产精品videossex| 美腿丝袜亚洲综合| 粉嫩av在线播放| 91popny丨九色丨国产| 亚洲日韩欧美视频一区| 国产精品videosex性欧美| 国产一区二区三区在线看麻豆| 日韩情涩欧美日韩视频| 可以看的av网址| 亚洲午夜无码av毛片久久| 91国在线观看| 婷婷五月综合久久中文字幕| 天天影视综合| 国产有码在线| 日韩女优制服丝袜电影| 日日碰狠狠添天天爽超碰97| 91精品免费在线观看| 国产91麻豆视频| 高潮毛片在线观看| h小视频在线观看网| 丰满少妇一区二区| 免费久久久一本精品久久区| 天天色图综合网| 91免费观看网站| 91黄页在线观看| chinese全程对白| 91国内在线| 曰皮视频在线播放免费的| 欧美乱人伦中文字幕在线| 成人午夜天堂| 午夜无码国产理论在线| 午夜在线电影亚洲一区| 国产极品美女到高潮| 一道本无吗dⅴd在线播放一区| 在线观看av的网址| 91嫩草免费看| 日韩视频免费观看| 亚洲第一在线播放| 天堂8中文在线最新版在线| 成人亚洲精品久久久久软件| 精品人妻无码一区二区色欲产成人| 97久久综合精品久久久综合| 丰满的亚洲女人毛茸茸| 国产v综合v亚洲欧美久久| 亚洲日本中文字幕免费在线不卡| 神马久久高清| 污视频网站免费观看| 91福利在线免费观看| 国产一级免费视频| 亚洲天堂avav| 成人黄色a级片| 日本猛少妇色xxxxx免费网站| 性爱在线免费视频| 成人精品视频一区| 综合色就爱涩涩涩综合婷婷| 国产在线观看你懂的| 久久久久久99精品| 亚洲精品国产一区二区三区| 国产精品视频一区二区三区,| 国产麻豆一区二区三区精品| 自产国语精品视频| 国产一区91精品张津瑜| 亚洲一卡二卡在线| 激情综合网激情| 欧美gv在线观看| 色婷婷久久综合中文久久蜜桃av| av一区二区在线播放| 国产精品天堂蜜av在线播放| av日韩在线网站| 亚洲丝袜美腿综合|