精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++語言的15個晦澀特性

開發 后端
這個列表收集了 C++ 語言的一些晦澀(Obscure)特性,是我經年累月研究這門語言的各個方面收集起來的。C++非常龐大,我總是能學到一些新知識。即使你對C++已了如指掌,也希望你能從列表中學到一些東西。下面列舉的特性,根據晦澀程度由淺入深進行排序。

這個列表收集了 C++ 語言的一些晦澀(Obscure)特性,是我經年累月研究這門語言的各個方面收集起來的。C++非常龐大,我總是能學到一些新知識。即使你對C++已了如指掌,也希望你能從列表中學到一些東西。下面列舉的特性,根據晦澀程度由淺入深進行排序。

  • 1. 方括號的真正含義
  • 2. 最煩人的解析
  • 3.替代運算標記符
  • 4. 重定義關鍵字
  • 5. Placement new
  • 6.在聲明變量的同時進行分支
  • 7.成員函數的引用修飾符
  • 8.轉向完整的模板元編程
  • 9.指向成員的指針操作符
  • 10. 靜態實例方法
  • 11.重載++和–
  • 12.操作符重載和檢查順序
  • 13.函數作為模板參數
  • 14.模板的參數也是模板
  • 15.try塊作為函數

方括號的真正含義

用來訪問數組元素的ptr[3]其實只是*(ptr + 3)的縮寫,與用*(3 + ptr)是等價的,因此反過來與3[ptr]也是等價的,使用3[ptr]是完全有效的代碼

最煩人的解析

“most vexing parse”這個詞是由Scott Meyers提出來的,因為C++語法聲明的二義性會導致有悖常理的行為:

  1. // 這個解釋正確? 
  2. // 1) 類型std::string的變量會通過std::string()實例化嗎? 
  3. // 2) 一個函數聲明,返回一個std::string值并有一個函數指針參數, 
  4. // 該函數也返回一個std::string但沒有參數? 
  5. std::string foo(std::string()); 
  6.   
  7. // 還是這個正確? 
  8. // 1)類型int變量會通過int(x)實例化嗎? 
  9. // 2)一個函數聲明,返回一個int值并有一個參數, 
  10. // 該參數是一個名為x的int型變量嗎? 
  11. int bar(int(x)); 

兩種情形下C++標準要求的是第二種解釋,即使***種解釋看起來更直觀。程序員可以通過包圍括號中變量的初始值來消除歧義:

  1. //加括號消除歧義 
  2. std::string foo((std::string())); 
  3. int bar((int(x))); 

第二種情形讓人產生二義性的原因是int y = 3;等價于int(y) = 3;

譯者注:這一點我覺得有點迷惑,下面是我在g++下的測試用例:

  1. #include <iostream> 
  2. #include <string> 
  3. using namespace std; 
  4.   
  5. int bar(int(x));   // 等價于int bar(int x) 
  6.   
  7. string foo(string());  // 等價于string foo(string (*)()) 
  8.   
  9. string test() { 
  10.     return "test"
  11.   
  12. int main() 
  13.     cout << bar(2) << endl; // 輸出2 
  14.     cout << foo(test); // 輸出test 
  15.     return 0; 
  16.   
  17. int bar(int(x)) {  
  18.     return x; 
  19.   
  20. string foo(string (*fun)()) { 
  21.     return (*fun)(); 

能正確輸出,但如果按作者意思添加上括號后再編譯就會報一堆錯誤:“在此作用域尚未聲明”、“重定義”等,還不清楚作者的意圖。

替代運算標記符

標記符and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq, <%, %>, <: 和 :>都可以用來代替我們常用的&&, &=, &, |, ~, !, !=, ||, |=, ^, ^=, {, }, [ 和 ]。在鍵盤上缺乏必要的符號時你可以使用這些運算標記符來代替。

重定義關鍵字

通過預處理器重定義關鍵字從技術上講會引起錯誤,但實際上是允許這樣做的。因此你可以使用類似#define true false 或 #define else來搞點惡作劇。但是,也有它合法有用的時候,例如,如果你正在使用一個很大的庫而且需要繞過C++訪問保護機制,除了給庫打補丁的方法外,你也可 以在包含該庫頭文件之前關閉訪問保護來解決,但要記得在包含庫頭文件之后一定要打開保護機制!

  1. #define class struct 
  2. #define private public 
  3. #define protected public 
  4.   
  5. #include "library.h" 
  6.   
  7. #undef class 
  8. #undef private 
  9. #undef protected 

注意這種方式不是每一次都有效,跟你的編譯器有關。當實例變量沒有被訪問控制符修飾時,C++只需要將這些實例變量順序布局即可,所以編譯器可以對 訪問控制符組重新排序來自由更改內存布局。例如,允許編譯器移動所有的私有成員放到公有成員的后面。另一個潛在的問題是名稱重整(name mangling),Microsoft的C++編譯器將訪問控制符合并到它們的name mangling表里,因此改變訪問控制符意味著將破壞現有編譯代碼的兼容性。

譯者注:在C++中,Name Mangling 是為了支持重載而加入的一項技術。編譯器將目標源文件中的名字進行調整,這樣在目標文件符號表中和連接過程中使用的名字和編譯目標文件的源程序中的名字不一樣,從而實現重載。

#p#

Placement new

Placement new是new操作符的一個替代語法,作用在已分配的對象上,該對象已有正確的大小和正確的賦值,這包括建立虛函數表和調用構造函數。

譯者注:placement new就是在用戶指定的內存位置上構建新的對象,這個構建過程不需要額外分配內存,只需要調用對象的構造函數即可。placement new實際上是把原本new做的兩步工作分開來:***步自己分配內存,第二步調用類的構造函數在自己已分配的內存上構建新的對象。placement new的好處:1)在已分配好的內存上進行對象的構建,構建速度快。2)已分配好的內存可以反復利用,有效的避免內存碎片問題。

  1. #include <iostream> 
  2. using namespace std; 
  3.   
  4. struct Test { 
  5.   int data; 
  6.   Test() { cout << "Test::Test()" << endl; } 
  7.   ~Test() { cout << "Test::~Test()" << endl; } 
  8. }; 
  9.   
  10. int main() { 
  11.   // Must allocate our own memory 
  12.   Test *ptr = (Test *)malloc(sizeof(Test)); 
  13.   
  14.   // Use placement new 
  15.   new (ptr) Test; 
  16.   
  17.   // Must call the destructor ourselves 
  18.   ptr->~Test(); 
  19.   
  20.   // Must release the memory ourselves 
  21.   free(ptr); 
  22.   
  23.   return 0; 

當在性能關鍵的場合需要自定義分配器時可以使用Placement new。例如,一個slab分配器從單個的大內存塊開始,使用placement new在塊里順序分配對象。這不僅避免了內存碎片,也節省了malloc引起的堆遍歷的開銷。

在聲明變量的同時進行分支

C++包含一個語法縮寫,能在聲明變量的同時進行分支。看起來既像單個的變量聲明也可以有if或while這樣的分支條件。

  1. struct Event { virtual ~Event() {} }; 
  2. struct MouseEvent : Event { int x, y; }; 
  3. struct KeyboardEvent : Event { int key; }; 
  4.   
  5. void log(Event *event) { 
  6.   if (MouseEvent *mouse = dynamic_cast<MouseEvent *>(event)) 
  7.     std::cout << "MouseEvent " << mouse->x << " " << mouse->y << std::endl; 
  8.   
  9.   else if (KeyboardEvent *keyboard = dynamic_cast<KeyboardEvent *>(event)) 
  10.     std::cout << "KeyboardEvent " << keyboard->key << std::endl; 
  11.   
  12.   else 
  13.     std::cout << "Event" << std::endl; 

成員函數的引用修飾符

C++11允許成員函數在對象的值類型上進行重載,this指針會將該對象作為一個引用修飾符。引用修飾符會放在cv限定詞(譯者注:CV限定詞有 三種:const限定符、volatile限定符和const-volatile限定符)相同的位置并依據this對象是左值還是右值影響重載解析:

  1. #include <iostream> 
  2.   
  3. struct Foo { 
  4.   void foo() & { std::cout << "lvalue" << std::endl; } 
  5.   void foo() && { std::cout << "rvalue" << std::endl; } 
  6. }; 
  7.   
  8. int main() { 
  9.   Foo foo; 
  10.   foo.foo(); // Prints "lvalue" 
  11.   Foo().foo(); // Prints "rvalue" 
  12.   return 0; 

轉向完整的模板元編程

C++模板是為了實現編譯時元編程,也就是該程序能生成其它的程序。設計模板系統的初衷是進行簡單的類型替換,但是在C++標準化過程中突然發現模板實際上功能十分強大,足以執行任意計算,雖然很笨拙很低效,但通過模板特化的確可以完成一些計算:

  1. // Recursive template for general case 
  2. template <int N> 
  3. struct factorial { 
  4.   enum { value = N * factorial<N - 1>::value }; 
  5. }; 
  6.   
  7. // Template specialization for base case 
  8. template <> 
  9. struct factorial<0> { 
  10.   enum { value = 1 }; 
  11. }; 
  12.   
  13. enum { result = factorial<5>::value }; // 5 * 4 * 3 * 2 * 1 == 120 

C++模板可以被認為是一種功能型編程語言,因為它們使用遞歸而非迭代而且包含不可變狀態。你可以使用typedef創建一個任意類型的變量,使用enum創建一個int型變量,數據結構內嵌在類型自身。

  1. // Compile-time list of integers 
  2. template <int D, typename N> 
  3. struct node { 
  4.   enum { data = D }; 
  5.   typedef N next; 
  6. }; 
  7. struct end {}; 
  8.   
  9. // Compile-time sum function 
  10. template <typename L> 
  11. struct sum { 
  12.   enum { value = L::data + sum<typename L::next>::value }; 
  13. }; 
  14. template <> 
  15. struct sum<end> { 
  16.   enum { value = 0 }; 
  17. }; 
  18.   
  19. // Data structures are embedded in types 
  20. typedef node<1, node<2, node<3, end> > > list123; 
  21. enum { total = sum<list123>::value }; // 1 + 2 + 3 == 6 

當然這些例子沒什么用,但模板元編程的確可以做一些有用的事情,比如可以操作類型列表。但是,使用C++模板的編程語言可用性極低,因此請謹慎和少量使用。模板代碼很難閱讀,編譯速度慢,而且因其冗長和迷惑的錯誤信息而難以調試。

#p#

指向成員的指針操作符

指向成員的指針操作符可以讓你在一個類的任何實例上描述指向某個成員的指針。有兩種pointer-to-member操作符,取值操作符*和指針操作符->:

  1. #include <iostream> 
  2. using namespace std; 
  3.   
  4. struct Test { 
  5.   int num; 
  6.   void func() {} 
  7. }; 
  8.   
  9. // Notice the extra "Test::" in the pointer type 
  10. int Test::*ptr_num = &Test::num; 
  11. void (Test::*ptr_func)() = &Test::func; 
  12.   
  13. int main() { 
  14.   Test t; 
  15.   Test *pt = new Test; 
  16.   
  17.   // Call the stored member function 
  18.   (t.*ptr_func)(); 
  19.   (pt->*ptr_func)(); 
  20.   
  21.   // Set the variable in the stored member slot 
  22.   t.*ptr_num = 1; 
  23.   pt->*ptr_num = 2; 
  24.   
  25.   delete pt; 
  26.   return 0; 

該特征實際上十分有用,尤其在寫庫的時候。例如,Boost::Python, 一個用來將C++綁定到Python對象的庫,就使用成員指針操作符,在包裝對象時很容易的指向成員。

  1. #include <iostream> 
  2. #include <boost/python.hpp> 
  3. using namespace boost::python; 
  4.   
  5. struct World { 
  6.   std::string msg; 
  7.   void greet() { std::cout << msg << std::endl; } 
  8. }; 
  9.   
  10. BOOST_PYTHON_MODULE(hello) { 
  11.   class_<World>("World"
  12.     .def_readwrite("msg", &World::msg) 
  13.     .def("greet", &World::greet); 

記住使用成員函數指針與普通函數指針是不同的。在成員函數指針和普通函數指針之間casting是無效的。例如,Microsoft編譯器里的成員 函數使用了一個稱為thiscall的優化調用約定,thiscall將this參數放到ecx寄存器里,而普通函數的調用約定卻是在棧上解析所有的參 數。

而且,成員函數指針可能比普通指針大四倍左右,編譯器需要存儲函數體的地址,到正確父地址(多個繼承)的偏移,虛函數表(虛繼承)中另一個偏移的索引,甚至在對象自身內部的虛函數表的偏移也需要存儲(為了前向聲明類型)。

  1. #include <iostream> 
  2.   
  3. struct A {}; 
  4. struct B : virtual A {}; 
  5. struct C {}; 
  6. struct D : A, C {}; 
  7. struct E; 
  8.   
  9. int main() { 
  10.   std::cout << sizeof(void (A::*)()) << std::endl; 
  11.   std::cout << sizeof(void (B::*)()) << std::endl; 
  12.   std::cout << sizeof(void (D::*)()) << std::endl; 
  13.   std::cout << sizeof(void (E::*)()) << std::endl; 
  14.   return 0; 
  15.   
  16. // 32-bit Visual C++ 2008:  A = 4, B = 8, D = 12, E = 16 
  17. // 32-bit GCC 4.2.1:        A = 8, B = 8, D = 8,  E = 8 
  18. // 32-bit Digital Mars C++: A = 4, B = 4, D = 4,  E = 4 

在Digital Mars編譯器里所有的成員函數都是相同的大小,這是源于這樣一個聰明的設計:生成“thunk”函數來運用右偏移而不是存儲指針自身內部的偏移。

靜態實例方法

C++中可以通過實例調用靜態方法也可以通過類直接調用。這可以使你不需要更新任何調用點就可以將實例方法修改為靜態方法。

  1. struct Foo { 
  2.   static void foo() {} 
  3. }; 
  4.   
  5. // These are equivalent 
  6. Foo::foo(); 
  7. Foo().foo(); 

重載++和–

C++的設計中自定義操作符的函數名稱就是操作符本身,這在大部分情況下都工作的很好。例如,一元操作符的-和二元操作符的-(取反和相減)可以通 過參數個數來區分。但這對于一元遞增和遞減操作符卻不奏效,因為它們的特征似乎完全相同。C++語言有一個很笨拙的技巧來解決這個問題:后綴++和–操作 符必須有一個空的int參數作為標記讓編譯器知道要進行后綴操作(是的,只有int類型有效)。

  1. struct Number { 
  2.   Number &operator ++ (); // Generate a prefix ++ operator 
  3.   Number operator ++ (int); // Generate a postfix ++ operator 
  4. }; 

操作符重載和檢查順序

重載,(逗號),||或者&&操作符會引起混亂,因為它打破了正常的檢查規則。通常情況下,逗號操作符在整個左邊檢查完畢才開始檢 查右邊,|| 和 &&操作符有短路行為:僅在必要時才會去檢查右邊。無論如何,操作符的重載版本僅僅是函數調用且函數調用以未指定的順序檢查它們的參數。

重載這些操作符只是一種濫用C++語法的方式。作為一個實例,下面我給出一個Python形式的無括號版打印語句的C++實現:

  1. #include <iostream> 
  2.   
  3. namespace __hidden__ { 
  4.   struct print { 
  5.     bool space; 
  6.     print() : space(false) {} 
  7.     ~print() { std::cout << std::endl; } 
  8.   
  9.     template <typename T> 
  10.     print &operator , (const T &t) { 
  11.       if (space) std::cout << ' '
  12.       else space = true
  13.       std::cout << t; 
  14.       return *this
  15.     } 
  16.   }; 
  17.   
  18. #define print __hidden__::print(), 
  19.   
  20. int main() { 
  21.   int a = 1, b = 2; 
  22.   print "this is a test"
  23.   print "the sum of", a, "and", b, "is", a + b; 
  24.   return 0; 

#p#

函數作為模板參數

眾所周知,模板參數可以是特定的整數也可以是特定的函數。這使得編譯器在實例化模板代碼時內聯調用特定的函數以獲得更高效的執行。下面的例子里,函數memoize的模板參數也是一個函數且只有新的參數值才通過函數調用(舊的參數值可以通過cache獲得):

  1. #include <map> 
  2.   
  3. template <int (*f)(int)> 
  4. int memoize(int x) { 
  5.   static std::map<intint> cache; 
  6.   std::map<intint>::iterator y = cache.find(x); 
  7.   if (y != cache.end()) return y->second; 
  8.   return cache[x] = f(x); 
  9.   
  10. int fib(int n) { 
  11.   if (n < 2) return n; 
  12.   return memoize<fib>(n - 1) + memoize<fib>(n - 2); 

模板的參數也是模板

模板參數實際上自身的參數也可以是模板,這可以讓你在實例化一個模板時可以不用模板參數就能夠傳遞模板類型。看下面的代碼:

  1. template <typename T> 
  2. struct Cache { ... }; 
  3.   
  4. template <typename T> 
  5. struct NetworkStore { ... }; 
  6.   
  7. template <typename T> 
  8. struct MemoryStore { ... }; 
  9.   
  10. template <typename Store, typename T> 
  11. struct CachedStore { 
  12.   Store store; 
  13.   Cache<T> cache; 
  14. }; 
  15.   
  16. CachedStore<NetworkStore<int>, int> a; 
  17. CachedStore<MemoryStore<int>, int> b; 

CachedStore的cache存儲的數據類型與store的類型相同。然而我們在實例化一個CachedStore必須重復寫數據類型(上面的代碼 是int型),store本身要寫,CachedStore也要寫,關鍵是我們這并不能保證兩者的數據類型是一致的。我們真的只想要確定數據類型一次即 可,所以我們可以強制其不變,但是沒有類型參數的列表會引起編譯出錯:

  1. // 下面編譯通不過,因為NetworkStore和MemoryStore缺失類型參數 
  2. CachedStore<NetworkStore, int> c; 
  3. CachedStore<MemoryStore, int> d; 

模板的模板參數可以讓我們獲得想要的語法。注意你必須使用class關鍵字作為模板參數(他們自身的參數也是模板)

  1. template <template <typenameclass Store, typename T> 
  2. struct CachedStore2 { 
  3.   Store<T> store; 
  4.   Cache<T> cache; 
  5. }; 
  6.   
  7. CachedStore2<NetworkStore, int> e; 
  8. CachedStore2<MemoryStore, int> f; 

try塊作為函數

函數的try塊會在檢查構造函數的初始化列表時捕獲拋出的異常。你不能在初始化列表的周圍加上try-catch塊,因為其只能出現在函數體外。為了解決這個問題,C++允許try-catch塊也可作為函數體:

  1. int f() { throw 0; } 
  2.   
  3. // 這里沒有辦法捕獲由f()拋出的異常 
  4. struct A { 
  5.   int a; 
  6.   A::A() : a(f()) {} 
  7. }; 
  8.   
  9. // 如果try-catch塊被用作函數體并且初始化列表移至try關鍵字之后的話, 
  10. // 那么由f()拋出的異常就可以捕獲到 
  11. struct B { 
  12.   int b; 
  13.   B::B() try : b(f()) { 
  14.   } catch(int e) { 
  15.   } 
  16. }; 

奇怪的是,這種語法不僅僅局限于構造函數,也可用于其他的所有函數定義。

原文鏈接:http://madebyevan.com/obscure-cpp-features/

譯文鏈接:http://blog.jobbole.com/54140/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2011-11-14 09:56:17

C++

2010-01-11 13:37:31

C++語言

2021-06-16 07:56:48

C++新特性類型

2010-01-15 17:38:37

C++語言

2025-09-25 08:23:31

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2010-01-25 18:19:17

C++特性

2009-09-18 09:59:39

C# CLR

2012-09-03 16:31:34

Firefox 15瀏覽器

2010-01-22 15:30:36

C++語言

2010-01-15 14:46:20

C++語言

2011-01-05 11:12:34

C++

2024-05-27 16:27:22

2013-07-29 11:11:33

C++C++11

2010-01-21 16:24:02

C++語言

2015-02-04 10:49:13

Visual C++C++Windows API

2010-01-22 10:26:40

C++語言

2010-01-28 15:31:34

學習C++語言

2024-02-21 14:55:19

C++語言編程
點贊
收藏

51CTO技術棧公眾號

97视频在线观看成人| 国产激情小视频在线| 国产一区二区三区影院| av在线首页| 看电视剧不卡顿的网站| 欧美日韩精品一区二区三区| 小说区图片区图片区另类灬| 精品久久久久久久久久久久久久久久 | 免费黄色在线网站| 国产一区二区在线免费观看| 在线观看久久av| 制服丝袜中文字幕第一页| 午夜视频在线| 黄色小说综合网站| 久久韩剧网电视剧| 日本精品一二三区| 校园春色亚洲色图| 国产精品丝袜在线| 亚洲自拍偷拍色图| 好吊妞视频一区二区三区| 国产成人三级| 日韩欧美不卡在线观看视频| 日本www在线视频| 成年人视频在线看| 国产成人av电影在线播放| 欧美一区二区三区图| 亚洲不卡的av| 亚洲图色一区二区三区| 精品久久久久久国产| 精品一区二区三区日本| 伊人成人在线观看| 91精品国产自产在线观看永久∴| 亚洲国产成人精品久久| 久久久久国产一区| av电影在线免费| 国产精品欧美经典| 亚洲一区美女视频在线观看免费| 成人精品免费在线观看| 91精品综合久久久久久久久久久| 亚洲第一在线视频| 在线观看岛国av| 51精品在线| 国产精品久久久久桃色tv| 99久久精品免费看国产一区二区三区| 99re热视频| 99伊人成综合| 亚洲无线码在线一区观看| 又色又爽又黄18网站| 成人自拍视频网| 精品成人国产在线观看男人呻吟| 男人j进女人j| 最近高清中文在线字幕在线观看| 久久精品人人爽人人爽| 国产一区二区黄色| www三级免费| 久久成人羞羞网站| 久久精品久久久久久| www.中文字幕av| 日韩视频在线直播| 欧美日本在线一区| 国产美女三级视频| 欧美办公室脚交xxxx| 亚洲一区在线视频观看| 手机成人av在线| av在线第一页| 狠狠久久亚洲欧美| 成人a级免费视频| 波多野结衣视频在线观看| 免费亚洲婷婷| 4438全国亚洲精品在线观看视频| 久久午夜无码鲁丝片| 国产精品91一区二区三区| 永久免费看mv网站入口亚洲| 久久久久9999| 日韩美脚连裤袜丝袜在线| 亚洲国产成人精品久久久国产成人一区| 中文字幕66页| 欧美啪啪网站| 欧美一区二区三区小说| 亚洲一区二区三区四区精品| 国产精品视频首页| 日韩欧美在线1卡| 黄页网站在线看| 97超碰成人| 亚洲国产精品热久久| 色一情一乱一伦一区二区三区| 精品无码一区二区三区的天堂| 久久国产精品亚洲77777| 日韩精品在线观看网站| 国产激情第一页| 偷拍一区二区| 亚洲人成亚洲人成在线观看| 欧美另类z0zx974| 成人同人动漫免费观看| 日韩在线观看网址| 日本猛少妇色xxxxx免费网站| 日本一本不卡| 中文字幕亚洲一区在线观看| 亚洲色偷偷综合亚洲av伊人| 性网站在线观看| fc2在线中文字幕| 国产在线精品一区二区夜色 | 国产精品久久久久久福利| 亚洲丝袜制服诱惑| 97在线免费视频观看| 国产激情在线视频| 精品久久久久久久久中文字幕| 欧美日韩不卡在线视频| 成人性生活av| 亚洲美女区一区| 精品免费日产一区一区三区免费| 青青色在线视频| 97久久人人超碰| 伊人久久大香线蕉av一区| 成年人视频网站在线| 亚洲美女视频在线观看| 人人干视频在线| 亚洲福利影院| 色哟哟一区二区| 亚洲精品无码久久久久久久| 极品束缚调教一区二区网站 | 97视频网站入口| 丰满少妇xoxoxo视频| 激情成人综合网| 国产日韩欧美成人| 亚洲一级在线播放| 国产美女一区| 国产激情综合五月久久| 青青视频在线免费观看| 狠狠色狠狠色综合系列| 久久福利电影| 麻豆视频在线| 富二代精品短视频| 日本少妇xxxx| 欧美日韩一区二区高清| 欧美精品福利视频| 国产三级在线观看视频| 丁香婷婷综合激情五月色| 欧美 另类 交| 欧美xx视频| 亚洲裸体xxxx| 国产尤物在线视频| 99re8在线精品视频免费播放| 国内精品视频一区二区三区| 97超碰成人| 97久久超碰福利国产精品…| 亚洲毛片在线播放| 一区二区三区91| 日本一区二区在线观看视频| 国产一区视频在线观看免费| 亚洲最大成人网色| 日本成人在线播放| 欧美久久久久免费| 少妇视频一区二区| 韩国欧美一区二区| 日韩video| 日本在线成人| 久久久日本电影| 天天综合网在线观看| 精品成人久久av| 公侵犯人妻一区二区三区| 久久五月激情| 亚洲三区视频| 经典三级久久| 欧美日韩高清区| 亚洲日本在线播放| 黄色成人av网| 极品人妻videosss人妻| 男女激情视频一区| 中文字幕一区二区三区四区五区人 | 免费黄色特级片| 波多野结衣的一区二区三区| 国产一区二区在线免费| 羞羞视频在线免费国产| 亚洲国产99精品国自产| 区一区二在线观看| 中文字幕在线不卡| 亚洲精品一二三四| 国产日韩一区二区三区在线| 日本不卡二区| 精品成人18| 欧美与欧洲交xxxx免费观看| 蜜桃免费在线| 欧美一级黄色录像| 九九精品视频免费| 成人av片在线观看| 欧美精品aaaa| 欧美日韩久久| 韩国精品一区二区三区六区色诱| 日韩电影大全网站| 久久国产精品电影| 免费国产在线观看| 欧美夫妻性生活| 亚洲午夜18毛片在线看| 亚洲欧洲国产日本综合| 在线中文字日产幕| 蜜臀av一区二区三区| 人妻激情另类乱人伦人妻| 国产91久久精品一区二区| 91久久中文字幕| 在线一区av| 欧美成人午夜免费视在线看片 | 亚洲国产无线乱码在线观看| 有码一区二区三区| 久久久视频6r| 国产美女娇喘av呻吟久久| 欧美aⅴ在线观看| 亚洲国产一区二区三区在线播放| 国产一区在线观| 亚洲国产一区二区久久| 欧美一级片一区| 九色国产在线观看| 亚洲成人中文字幕| 成人免费a视频| 亚洲老妇xxxxxx| 老司机福利在线观看| 国产福利一区二区三区视频在线 | 日本特级黄色大片| 日韩动漫一区| 国产福利久久精品| 日本美女一区| 欧美性受xxxx黑人猛交| 特级毛片在线| 久久中文久久字幕| 日本波多野结衣在线| 欧美电影影音先锋| 日本三级一区二区三区| 岛国av一区二区| 国产在线一二区| 亚洲乱码一区二区三区在线观看| 无码少妇精品一区二区免费动态| av在线一区二区三区| 奇米视频888| 奇米一区二区三区av| 国产福利视频在线播放| 制服诱惑一区二区| 成人毛片100部免费看| 天天综合国产| 中文字幕一区综合| 999久久久91| 亚洲欧洲精品一区| 成人动漫免费在线观看| 日本视频一区二区不卡| 最新精品国偷自产在线| 乱一区二区三区在线播放| 91嫩草精品| 国产精品日韩一区二区| 嗯用力啊快一点好舒服小柔久久| 亚洲影视九九影院在线观看| 欧美成a人片免费观看久久五月天| 91黑丝高跟在线| 在线观看欧美日韩电影| 欧洲中文字幕国产精品| 忘忧草在线影院两性视频| 欧美日韩成人在线播放| 美女91在线| 久久免费视频网站| 九色porny丨首页入口在线| 91精品国产网站| av高清不卡| 国产精品第1页| 涩涩涩久久久成人精品| 亚洲www视频| 欧美日韩破处视频| 国产在线不卡精品| 国产高清亚洲| 91夜夜未满十八勿入爽爽影院| av成人免费看| 92国产精品久久久久首页| 亚洲欧洲一二区| 91九色偷拍| 欧洲亚洲视频| 日韩中文一区| 自拍视频亚洲| 日韩精品―中文字幕| 日韩不卡一区二区三区| 污网站在线免费| 成人免费三级在线| 性欧美13一14内谢| 国产日韩欧美一区二区三区综合| 中文字幕乱码在线人视频| 国产91高潮流白浆在线麻豆| 国产免费中文字幕| 国产成人欧美日韩在线电影| 免费黄色a级片| 99久久夜色精品国产网站| 亚洲精品国产精品国自产网站| 一区在线观看免费| 香蕉免费毛片视频| 欧美日韩一本到| 99热这里只有精品在线观看| 日韩欧美aaaaaa| 亚洲第一大网站| 亚洲乱亚洲乱妇无码| 99福利在线| 国产成+人+综合+亚洲欧美丁香花| 日本在线视频一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲一二三区视频| 欧美一进一出视频| 韩日成人在线| 亚洲男人天堂av在线| 成人国产亚洲欧美成人综合网| 亚洲最大视频网| 久久久久久**毛片大全| 久草成人在线视频| 欧美日韩一区在线| 亚洲 欧美 自拍偷拍| 久久国产天堂福利天堂| 欧美aaa视频| 不卡视频一区二区| 欧美gay男男猛男无套| 男人天堂1024| 国产福利一区二区三区视频在线| 丁香六月激情综合| 午夜精品福利一区二区三区av| 一级特黄aaaaaa大片| 精品视频www| 91在线中文| 6080yy精品一区二区三区| 精品国产一区二| 中文字幕一区综合| 蜜桃视频在线一区| 成人做爰69片免费| 亚洲欧美电影院| 91丨porny丨在线中文| 欧美成人伊人久久综合网| eeuss影院www在线播放| 情事1991在线| 婷婷成人在线| 欧美日韩一道本| 成人一区二区三区视频在线观看 | 伊人国产在线视频| 久久久精品黄色| 国产综合精品视频| 亚洲激情视频网站| 亚洲乱亚洲乱妇| 国产精品女视频| 欧美自拍偷拍| 美女网站色免费| 国产精品天干天干在线综合| 丰满人妻一区二区三区四区| 亚洲人成五月天| 台湾成人免费视频| 日韩精彩视频| 日本中文字幕一区二区视频| 亚洲图片另类小说| 色悠悠亚洲一区二区| 玖玖综合伊人| 久久久亚洲国产天美传媒修理工| 97se亚洲国产一区二区三区| 成人在线国产视频| 成人精品gif动图一区| 国产成人啪精品午夜在线观看| 欧美成人在线直播| 97在线视频免费观看完整版| 成人91视频| 五月天激情综合网| 波多野结衣三级视频| 亚洲影院理伦片| 天天舔天天干天天操| 欧美综合在线观看| 欧美先锋资源| 伊人五月天婷婷| 亚洲一区二区偷拍精品| 欧美在线精品一区二区三区| 欧美国产日韩一区二区三区| 国产香蕉精品| 欧美精品久久久久久久自慰| 国产精品一区二区在线播放| 天堂资源在线播放| 亚洲免费小视频| 日日夜夜一区| 久无码久无码av无码| 99久精品国产| 最新在线中文字幕| 久久91精品国产91久久跳| gogo大尺度成人免费视频| 日本精品久久久久久久久久| 26uuu色噜噜精品一区| 在线观看日批视频| 欧美大片大片在线播放| 日韩欧美黄色| 91蝌蚪视频在线观看| 亚洲精品老司机| 丝袜+亚洲+另类+欧美+变态| 国产精品视频区1| 欧美精品国产一区二区| 黄色短视频在线观看| 欧美日韩国产bt| 日韩精品美女| 最新av在线免费观看| 91美女蜜桃在线| 国产探花精品一区二区| 欧美激情精品久久久久久大尺度 | 99re这里只有精品在线| 精品国模在线视频| 亚洲国产合集| 亚洲精品无码久久久久久久| 色8久久精品久久久久久蜜|