精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲va欧美va| 丁香啪啪综合成人亚洲| 国产黄色小视频在线观看| 好吊日精品视频| 亚洲成人激情在线| 400部精品国偷自产在线观看| 午夜老司机福利| 亚洲乱码久久| 国产一区二区三区视频在线观看| 亚洲三级在线观看视频| 国产美女一区视频| www.视频一区| 国产成人拍精品视频午夜网站| 国产wwwwxxxx| 日本午夜精品久久久| 亚洲成人一区在线| 亚洲成人精品电影在线观看| 午夜久久久久久噜噜噜噜| 日韩高清不卡一区二区三区| 国产视频精品一区二区三区| 1314成人网| 四虎影院观看视频在线观看 | 一级日本黄色片| sese综合| 激情久久av一区av二区av三区| 在线看视频不卡| 偷拍精品一区二区三区| 韩国理伦片一区二区三区在线播放| 91成人福利在线| 欧美成人免费观看视频| 精品国产一区二区三区四区 | 天天综合网 天天综合色| 日韩成人av网站| 色综合免费视频| 国产激情视频一区二区在线观看| 韩日欧美一区二区| 免费在线一区二区三区| 天天天综合网| 中文字幕亚洲欧美一区二区三区| 性欧美丰满熟妇xxxx性仙踪林| 国产成人av毛片| 8v天堂国产在线一区二区| www.国产区| 中文字幕成在线观看| 亚洲国产成人av网| 国产a级黄色大片| av色综合久久天堂av色综合在| 国产精品美女久久久久久2018| 牛人盗摄一区二区三区视频| 亚州av在线播放| eeuss国产一区二区三区| www.久久久| 99在线小视频| 极品美女销魂一区二区三区| 国产欧美日韩精品在线观看| 在线观看黄色网| 一本不卡影院| 欧美亚洲另类制服自拍| 欧美精品韩国精品| 亚洲每日更新| 欧美亚洲在线观看| 久久久久久久久久久久国产| 影音先锋国产精品| 欧美成人性色生活仑片| 久久精品这里只有精品| 18成人免费观看视频| 91精品国产91久久久久久| 少妇久久久久久被弄高潮| 我不卡伦不卡影院| 日韩视频欧美视频| 黄色录像一级片| 欧美视频日韩| 日韩中文第一页| 91精品在线麻豆| 黄色一级片网址| 欧美xxx黑人xxx水蜜桃| 一区二区三区日韩欧美精品| 你真棒插曲来救救我在线观看| 成人女同在线观看| 亚洲国产日韩av| 国产视频一区二区三区在线播放 | 亚洲制服丝袜在线播放| 亚洲欧美日本伦理| 中文字幕日韩综合av| 在线看的片片片免费| 亚洲人www| 国产成人精品日本亚洲| 一区二区不卡视频在线观看| 老司机精品视频在线| 91精品国产高清久久久久久91裸体| 人妻妺妺窝人体色www聚色窝| yourporn久久国产精品| 开心色怡人综合网站| 大片网站久久| 欧美精品 日韩| 五月激情婷婷在线| 日韩一区二区三区在线免费观看| 亚洲欧美在线观看| 亚洲成年人影院在线| 免费黄频在线观看| 精品国产乱码一区二区三区| 日韩精品在线视频| 美女福利视频网| 日韩精品卡一| 一区二区三区在线看| 欧美爱爱视频免费看| 久久精品国产福利| 亚洲国产精品电影| 最新黄色av网址| 日韩新的三级电影| 久久9热精品视频| 国内外成人免费视频| 噜噜噜在线观看播放视频| 国产精品亲子乱子伦xxxx裸| 欧美亚洲色图视频| 久久久久毛片| 国产又粗又猛又爽又黄91| 日韩在线伦理| 7777精品伊人久久久大香线蕉超级流畅 | 综合综合综合综合综合网| 久久精品国产亚洲7777| 无码一区二区三区| av影院午夜一区| 亚洲视频小说| 偷拍视频一区二区三区| 亚洲电影中文字幕| 欧美成欧美va| 国产一区在线观看麻豆| 日韩欧美国产二区| 性孕妇free特大另类| 欧美电影免费观看完整版| 极品蜜桃臀肥臀-x88av| 免费视频一区| 精选一区二区三区四区五区| av在线理伦电影| 91精品在线免费| 欧美爱爱免费视频| 玖玖国产精品视频| 欧美激情www| 波多野结衣在线观看| 在线精品视频一区二区| 性欧美丰满熟妇xxxx性仙踪林| 亚洲午夜电影| 国产精品国色综合久久| 五月天激情在线| 日韩一本二本av| 一级黄色录像毛片| 日韩福利电影在线| 精品中文字幕人| 老司机成人影院| 亚洲欧洲国产伦综合| 免费的毛片视频| av网站一区二区三区| 国产欧美日韩网站| 日韩av三区| 欧美精品精品精品精品免费| 国产男女无套免费网站| 中国色在线观看另类| 日本人69视频| 精品国产一区二区三区香蕉沈先生 | 亚洲男人的天堂网站| 999视频在线| 国产亚洲成aⅴ人片在线观看| www.日本xxxx| 亚洲91视频| 俄罗斯精品一区二区| 欧美人动性xxxxz0oz| 亚洲福利视频二区| 国产免费观看av| 久久精品人人做| 777一区二区| 在线看片不卡| 国产亚洲精品自在久久| 欧美美女日韩| 亚洲品质视频自拍网| 91高潮大合集爽到抽搐| 亚洲精品成a人| 污片免费在线观看| 日日嗨av一区二区三区四区| 亚洲精品免费在线看| 成人国产一区二区三区精品麻豆| 久久久精品日本| 五十路在线视频| 在线观看三级视频欧美| 永久免费看黄网站| 99re这里都是精品| 亚洲老女人av| 亚洲无吗在线| 亚洲欧美日本国产有色| 成功精品影院| 国产精品久久久久久超碰| 91看片在线观看| 精品久久99ma| 在线观看免费黄色小视频| 亚洲一区二区av在线| 免费在线观看a视频| 国产成人午夜精品5599| 国产精品无码专区av在线播放| 欧美日韩在线播放视频| 成人午夜电影免费在线观看| 唐人社导航福利精品| 久久777国产线看观看精品| 人成免费电影一二三区在线观看| 337p亚洲精品色噜噜噜| 国产精品老女人| 亚洲欧美一区二区三区极速播放| aaaaa级少妇高潮大片免费看| 国产在线播放一区三区四| 国产精品亚洲αv天堂无码| 欧美精品乱码| 欧美激情资源网| 亚洲国产成人一区| 99久久久精品免费观看国产 | 六月婷婷综合网| 成年人黄色大片在线| 99精品在免费线中文字幕网站一区 | 粉嫩av一区二区三区天美传媒| 性鲍视频在线观看| 欧美日韩乱国产| 99免在线观看免费视频高清| 艳女tv在线观看国产一区| 国产欧美精品一区二区色综合 | 成人vr资源| 成人精品一二区| 欧美aa免费在线| 欧美大荫蒂xxx| 麻豆tv入口在线看| 伊人久久免费视频| 五月婷婷六月色| 欧美久久久久久蜜桃| 日本一区二区不卡在线| 亚洲免费高清视频在线| 一本一本久久a久久| 久久久久久综合| 怡红院一区二区| 国产传媒欧美日韩成人| 日韩av片专区| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品欧美激情在线观看| 国产一区二区精品| 欧美精品在欧美一区二区| 国产国产精品| 神马影院我不卡午夜| 精品色999| 视频一区免费观看| 第一会所亚洲原创| 天天综合狠狠精品| 激情五月综合网| 欧洲国产精品| 国产一区二区精品福利地址| 日本视频精品一区| 日韩欧美ww| 欧洲精品码一区二区三区免费看| 性欧美xxxx免费岛国不卡电影| 久久久久久99| 国产一区二区精品福利地址| 午夜欧美性电影| 久久精品国内一区二区三区水蜜桃| 日韩中文不卡| 93在线视频精品免费观看| 在线一区日本视频| 欧美在线日韩| 九色自拍视频在线观看| 亚洲影院免费| 奇米影音第四色| 蜜臀av一级做a爰片久久| 玩弄japan白嫩少妇hd| 日韩二区在线观看| 三年中文在线观看免费大全中国| 国产精品自拍三区| 中文文字幕文字幕高清| 国产亚洲精品资源在线26u| 玖玖爱在线观看| 国产精品色哟哟网站| 欧美性生交大片| 亚洲国产一区视频| 日干夜干天天干| 欧美最猛黑人xxxxx猛交| 国产裸体永久免费无遮挡| 91精品国产综合久久香蕉麻豆| 亚洲AV无码一区二区三区少妇| 亚洲国产欧美一区二区丝袜黑人| 男女污视频在线观看| 日韩视频第一页| 97超碰免费在线| 日韩美女写真福利在线观看| 大胆国模一区二区三区| 国产一区二区三区色淫影院| 精品国产精品久久一区免费式| 色呦呦网站入口| 国产欧美一级| 久久久精品高清| 99麻豆久久久国产精品免费优播| 成人在线观看免费高清| 亚洲精品免费在线观看| 中文字幕第四页| 日韩一级黄色大片| 国产高清免费av在线| 久久久久久久久国产精品| 日韩欧美精品电影| 亚洲影视九九影院在线观看| 最新精品国偷自产在线| 日本福利视频网站| 日韩二区在线观看| av黄色一级片| 亚洲人成网站在线| 在线观看免费av片| 日韩女同互慰一区二区| 成人午夜影视| 51视频国产精品一区二区| 国产成人免费视频网站视频社区 | 国产精品一区二区三区在线播放| 成人动态视频| 亚洲开发第一视频在线播放| 亚洲一区二区伦理| 午夜激情av在线| 91视频.com| 精品深夜av无码一区二区老年| 色婷婷综合激情| 亚洲精品中文字幕成人片| 日韩在线免费高清视频| 激情都市亚洲| 久久久水蜜桃| 91精品国产成人观看| 黄色高清无遮挡| 国产美女精品人人做人人爽| 日韩av片在线免费观看| 亚洲成av人片观看| 国产乱淫a∨片免费观看| 国产午夜精品久久久| 丰乳肥臀在线| 91免费精品国偷自产在线| 成人在线免费观看91| 欧美成人黑人猛交| 久久久久亚洲蜜桃| 日韩欧美成人一区二区三区| 日韩精品一区二区三区在线观看 | 风流老熟女一区二区三区| 麻豆国产精品va在线观看不卡 | 伊人久久亚洲影院| 免费黄色av网址| 亚洲精品视频在线观看免费| 中文字幕第三页| 中文字幕日韩在线播放| 久久精品资源| 曰韩不卡视频| 国模少妇一区二区三区| 欧美a在线播放| 欧美日韩国产另类一区| 在线观看av的网站| 成人激情视频网| 日韩成人激情| 色一情一区二区三区| 亚洲欧美日韩一区| 精品人妻一区二区三区日产乱码 | 日韩欧美国产系列| 免费黄色网址在线观看| 成人午夜在线观看| 综合久久综合| 亚洲911精品成人18网站| 洋洋av久久久久久久一区| www.黄色片| 97在线观看免费| 精品国产网站| 波多野结衣国产精品| 亚洲另类中文字| 天堂网2014av| 国产精品吹潮在线观看| 天天射综合网视频| 激情综合激情五月| 岛国精品视频在线播放| youjizz在线播放| 国产在线拍偷自揄拍精品| 91精品天堂福利在线观看| 一级黄色大片免费看| 黑人狂躁日本妞一区二区三区 | 国产校园另类小说区| 中日精品一色哟哟| 欧美日本精品在线| theporn国产在线精品| 无码人妻h动漫| **欧美大码日韩| 六月丁香综合网| 国产精品久久久久久久久| 欧美在线网址| 亚洲av无码一区东京热久久| 色婷婷久久久综合中文字幕| 精品176二区| 久久亚洲综合网| 激情图片小说一区| 国产成人免费观看视频| 中文字幕久久精品| av免费观看网址| 国产精品一区在线观看乱码| 亚洲自拍欧美另类| 免费看电影在线| 欧美一区二区三区免费在线看 | 日本一区网站| 久久精品国产网站| 亚洲激情视频一区|