青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++編程失樂(lè)園

致力于解決論壇的不足,探討C++的原理

C++隨筆 之 泛型編程與設(shè)計(jì)新思維(轉(zhuǎn)載)

??作者:徐景周

???永遠(yuǎn)記住,編寫(xiě)代碼的宗旨在于簡(jiǎn)單明了,不要使用語(yǔ)言中的冷僻特性,耍小聰明,重要的是編寫(xiě)你理解的代碼,理解你編寫(xiě)的代碼,這樣你可能會(huì)做的更好。
--- Herb Sutter

??? 1998年,國(guó)際C++標(biāo)準(zhǔn)正式通過(guò),標(biāo)準(zhǔn)化對(duì)C++最重要的貢獻(xiàn)是:對(duì)"強(qiáng)大的抽象概念"給于更有力的支持,以降低軟件的復(fù)雜度,C++提供了二種功能強(qiáng)大的抽象方法:面向?qū)ο缶幊膛c泛型編程。面向?qū)ο缶幊檀蠹乙欢ê苁煜ち耍@里就不再哆嗦了。提到泛型編程(Generic Programming),有的人可能還不太熟悉,但是提到STL,你就一定會(huì)有所耳聞了。STL(Standard Template Library,標(biāo)準(zhǔn)模板庫(kù)) 其實(shí)就是泛型編程的實(shí)現(xiàn)品,STL是由Alexander Stepanov(STL之父)、David R Musser和Meng Lee三位大師共同發(fā)展,于1994年被納入C++標(biāo)準(zhǔn)程序庫(kù)。STL雖然加入C++標(biāo)準(zhǔn)庫(kù)的時(shí)間相對(duì)較晚,但它卻是C++標(biāo)準(zhǔn)程序庫(kù)中最具革命性的部分,同時(shí)也是C++標(biāo)準(zhǔn)程序庫(kù)中最重要的組成部分。由于新的C++標(biāo)準(zhǔn)庫(kù)中幾乎每一樣?xùn)|西都是由模板(Template)構(gòu)成的,當(dāng)然,STL也不會(huì)例外。所以,在這里有必要先概要說(shuō)明一下模板的有關(guān)概念。

模板概念
??? 通過(guò)使用模板可以使程序具有更好的代碼重用性。記住,模板是對(duì)源代碼進(jìn)行重用,而不是通過(guò)繼承和組合重用對(duì)象代碼,當(dāng)用戶(hù)使用模板時(shí),參數(shù)由編譯器來(lái)替換。模板由類(lèi)模板和函數(shù)模板二部分組成,以所處理的數(shù)據(jù)類(lèi)型的說(shuō)明作為參數(shù)的類(lèi)就叫類(lèi)模板,而以所處理的數(shù)據(jù)類(lèi)型的說(shuō)明作為參數(shù)的函數(shù)叫做函數(shù)模板。模板參數(shù)可以由類(lèi)型參數(shù)或非類(lèi)型參數(shù)組成,類(lèi)型參數(shù)可用class和typename關(guān)鍵字來(lái)指明,二者的意義相同,都表示后面的參數(shù)名代表一個(gè)潛在的內(nèi)置或用戶(hù)定義的類(lèi)型,非類(lèi)型參數(shù)由一個(gè)普通參數(shù)聲明構(gòu)成。下面是類(lèi)模板和函數(shù)模板的簡(jiǎn)單用法: template<class T1, int Size> class Queue // 類(lèi)模板,其中T1為類(lèi)型參數(shù),Size為非類(lèi)型參數(shù) { public: explicit Queue():size_(Size){}; // 顯式構(gòu)造,避免隱式轉(zhuǎn)換 …… template<class T2> void assign(T2 first,T2 last); // 內(nèi)嵌函數(shù)模板 private: T* temp_; int size_; } // 類(lèi)模板中內(nèi)嵌函數(shù)模板Compare的外圍實(shí)現(xiàn)(如在Queue類(lèi)外實(shí)現(xiàn)) template<class T1,int Size> template<class T2> void Queue<T1,Size>::assign (T2 first,T2 last) {}; // 模板的使用方法 int ia[4] = {0,1,2,3}; Queue<int, sizeof(ia)/sizeof(int)> qi; qi.assign(ai,ai+4); 泛型編程
??? 泛型編程和面向?qū)ο缶幊滩煌⒉灰竽阃ㄟ^(guò)額外的間接層來(lái)調(diào)用函數(shù),它讓你編寫(xiě)完全一般化并可重復(fù)使用的算法,其效率與針對(duì)某特定數(shù)據(jù)類(lèi)型而設(shè)計(jì)的算法相同。泛型編程的代表作品STL是一種高效、泛型、可交互操作的軟件組件。所謂泛型(Genericity),是指具有在多種數(shù)據(jù)類(lèi)型上皆可操作的含意,與模板有些相似。STL巨大,而且可以擴(kuò)充,它包含很多計(jì)算機(jī)基本算法和數(shù)據(jù)結(jié)構(gòu),而且將算法與數(shù)據(jù)結(jié)構(gòu)完全分離,其中算法是泛型的,不與任何特定數(shù)據(jù)結(jié)構(gòu)或?qū)ο箢?lèi)型系在一起。STL以迭代器(Iterators)和容器(Containers)為基礎(chǔ),是一種泛型算法(Generic Algorithms)庫(kù),容器的存在使這些算法有東西可以操作。STL包含各種泛型算法(algorithms)、泛型指針(iterators)、泛型容器(containers)以及函數(shù)對(duì)象(function objects)。STL并非只是一些有用組件的集合,它是描述軟件組件抽象需求條件的一個(gè)正規(guī)而有條理的架構(gòu)。
??? 迭代器(Iterators)是STL的核心,它們是泛型指針,是一種指向其他對(duì)象(objects)的對(duì)象,迭代器能夠遍歷由對(duì)象所形成的區(qū)間(range)。迭代器讓我們得以將容器(containers)與作用其上的算法(algorithms)分離,大多數(shù)的算法自身并不直接操作于容器上,而是操作于迭代器所形成的區(qū)間中。迭代器一般分為五種:Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iterator就象只從輸入?yún)^(qū)間中讀取數(shù)據(jù)一樣,具有只讀性,屬于單向移動(dòng),如STL中的istream_iterator。Output Iterator剛好相反,只寫(xiě)出數(shù)據(jù)到輸出區(qū)間中,具有只寫(xiě)性,屬于單向移動(dòng),如STL中的ostream_iterator。Forward Iterator也屬于單向移動(dòng),但不同之處是它同時(shí)具有數(shù)據(jù)讀、寫(xiě)性。Bidirections Iterator如名稱(chēng)暗示,支持雙向移動(dòng),不但可以累加(++)取得下一個(gè)元素,而且可以遞減(--)取前一個(gè)元素,支持讀、寫(xiě)性。Random Access Iterator功能最強(qiáng),除了以上各迭代器的功能外,還支持隨機(jī)元素訪(fǎng)問(wèn)(p+=n),下標(biāo)(p[n])、相減(p1-p2)及前后次序關(guān)系(p1<p2)等。Input Iterator和Output Iterator屬于同等最弱的二種迭代器,F(xiàn)orward Iterator是前二者功能的強(qiáng)化(refinement),Bidirections Iterator又是Forward Iterator迭代器的強(qiáng)化,最后Random Access Iterator又是Bidirections Iterator迭代器的強(qiáng)化。如下簡(jiǎn)單示例展示Input Iterator、Forward Iterator、Bidirections Iterator和Radom Access Iterator迭代器的功能(其中input_iterator_tag等帶tag字符串為各不同迭代器的專(zhuān)屬標(biāo)識(shí)):
1、InputIterator template<class InputIterator, class Distance> void advance(InputIterator& i, Distance n, input_iterator_tag) { for(; n>0; --n,++i){} // InputIterator具有++性 } 2、ForwardIterator template<class ForwardIterator, class Distance> void advance(ForwardIterator& i, Distance n,forward_iterator_tag) { advance(i, n, input_iterator_tag()); } 3、BidirectionalIterator template<class BidirectionalIterator, class Distance> void advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag) { if(n>=0) // 具有++、--性 for(; n>0; --n,++i){} else for(; n>0; ++n,--i){} } 4、RandomAccessIterator template<class RandomAccessIterator, class Distance> void advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag) { i += n; // 具有++、--、+=等性 } ??? 函數(shù)對(duì)象(Function object)也稱(chēng)仿函數(shù)(Functor),是一種能以一般函數(shù)調(diào)用語(yǔ)法來(lái)調(diào)用的對(duì)象,函數(shù)指針(Function pointer)是一種函數(shù)對(duì)象,所有具有operator()操作符重載的成員函數(shù)也是函數(shù)對(duì)象。函數(shù)對(duì)象一般分為無(wú)參函數(shù)(Generator),單參函數(shù)(Unary Function)和雙參函數(shù)(Binary Function)三種形式,它們分別能以f()、f(x)和f(x,y)的形式被調(diào)用,STL定義的其他所有函數(shù)對(duì)象都是這三種概念的強(qiáng)化。如下簡(jiǎn)單示例展示幾種形式的實(shí)現(xiàn):

1、無(wú)參(Generator)形式 struct counter { typedef int result_type; counter(result_type init=0):n(init){} result_type operator() { return n++;} result_type n; } 2、單參(Unary Function)形式 template<class Number> struct even // 函數(shù)對(duì)象even,找出第一個(gè)偶數(shù) { bool operator()(Number x) const {return (x&1) == 0;} } // 使用算法find_if在區(qū)間A到A+N中找到滿(mǎn)足函數(shù)對(duì)象even的元素 int A[] = {1,0,3,4}; const int N=sizeof(A)/sizeof(int); find_if(A,A+N, even<int>()); 3、雙參(Binary Function)形式 struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1<s2) < 0;} }; // 使用函數(shù)對(duì)象ltstr,輸出set容器中A和B的并集 const int N=3 const char* a[N] = {"xjz","xzh","gh"}; const char* b[N]= {"jzx","zhx","abc"}; set<const char*,ltstr> A(a,a+N); set<const char*,ltstr> B(b,b+N); set_union(A.begin(),A.end(),B.begin(),B.end(), ostream_iterator<const char*>(cout," "), ltstr()); ??? 容器(container)是一種對(duì)象(object),可以包含并管理其它的對(duì)象,并提供迭代器(iterators)用以定址其所包含之元素。根據(jù)迭代器種類(lèi)的不同,容器也分為幾中,以Input Iterator為迭代器的一般container,以Forward Iterator為迭代器的Forward Container,以Bidirectional Iterator 為迭代器的Reversible Container,以Random Access Iterator為迭代器的Random Access Container。STL定義二種大小可變的容器:序列式容器(Sequence Container)和關(guān)聯(lián)式容器(Associative Container)序列式容器包括vector、list和deque,關(guān)聯(lián)式容器包括set、map、multiset和multimap。以下示例簡(jiǎn)單說(shuō)明部分容器的使用: 1、vector使用 // 將A中以元素5為分割點(diǎn),分別排序,使排序后5后面的元素都大于5之前的元素(后區(qū)間不排序), // 然后輸出 int main() { int A[] = {7,2,6,4,5,8,9,3,1}; const int N=sizeof(A)/sizeof(int); vector<int> V(A,A+N); partial_sort(V,V+5,V+N); copy(V,V+N,ostream_iterator<int>(cout," ")); cout << endl; } 輸出可能是:1 2 3 4 5 8 9 7 6 2、list使用 // 產(chǎn)生一空l(shuí)ist,插入元素后排序,然后輸出 int main() { list<int> L1; L1.push_back(0); L1.push_front(1); L1.insert(++L1.begin,3); L1.sort(); copy(L1.begin(),L1.end(),ostream_iterator<int>(cout," ")); } 輸出:0 1 3 3、deque使用 int main() { deque<int> Q; Q.push_back(3); Q.push_front(1); Q.insert(Q.begin()+1,2); Copy(Q.begin(),Q.end(),ostream_iterator<int>(cout," ")); } 輸出:1 2 3 4、map使用 int main() { map<string,int> M; M.insert(make_pair("A",11); pair<map<string,int>::iterator, bool> p = M.insert(make_pair("C",5)); if(p.second) cout << p.first->second<<endl; } 輸出:5 5、multiset使用 int main() { const int N = 5; int a[N] = {4,1,1,3,5}; multiset<int> A(a,a+N); copy(A.begin(),A.end(),ostream_iterator<int>(cout," ")); } 輸出:1 1 3 4 5 設(shè)計(jì)新思維
??? 將設(shè)計(jì)模式(design patterns)、泛型編程(generic programming)和面向?qū)ο缶幊?object-oriented programming)有機(jī)的結(jié)合起來(lái),便形成了設(shè)計(jì)新思維。其中,設(shè)計(jì)模式是經(jīng)過(guò)提煉的出色設(shè)計(jì)方法,對(duì)于很多情況下碰到的問(wèn)題,它都是合理而可復(fù)用的解決方案;泛型編程是一種典范(paradigm),專(zhuān)注于將類(lèi)型抽象化,形成功能需求方面的一個(gè)精細(xì)集合,并利用這些需求來(lái)實(shí)現(xiàn)算法,相同的算法可以運(yùn)用于廣泛的類(lèi)型集中,所謂泛型,就是具有在多種數(shù)據(jù)類(lèi)型上皆可操作的含意;最后同面象對(duì)象編程中的多態(tài)(polymorphism)和模板(templates)等技術(shù)相結(jié)合,便獲得極高層次上的具有可復(fù)用性的泛型組件。泛型組件預(yù)先實(shí)現(xiàn)了設(shè)計(jì)模塊,可以讓用戶(hù)指定類(lèi)型和行為,從而形成合理的設(shè)計(jì),主要特點(diǎn)是靈活、通用和易用。
??? policies和policy類(lèi),是一種重要的類(lèi)設(shè)計(jì)技術(shù),所謂policy,是用來(lái)定義一個(gè)類(lèi)或類(lèi)模板的接口,該接口由下列之一或全部組成:內(nèi)部類(lèi)型定義、成員函數(shù)和成員變量。基于policy的類(lèi)由許多小型類(lèi)(稱(chēng)為policies)組成,每一個(gè)這樣的小型類(lèi)只負(fù)責(zé)單純?nèi)缧袨榛蚪Y(jié)構(gòu)的某一方面。Policies機(jī)制由模板和多重繼承組成,它們可以互相混合搭配,從而形成設(shè)計(jì)戎的多樣性,通過(guò)plicy類(lèi),不但可以定制行為,也可以定制結(jié)構(gòu)。

下面簡(jiǎn)單舉例說(shuō)明泛化思維和面向?qū)ο笏季S在部分設(shè)計(jì)模式中的運(yùn)用。

??? Singletons設(shè)計(jì)模式泛化實(shí)現(xiàn) Singleton模式是一種保證一個(gè)對(duì)象(class)只有一個(gè)實(shí)體,并為它提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。Singleton是一種經(jīng)過(guò)改進(jìn)的全局變量,既在程序中只能有唯一實(shí)體的類(lèi)型,它的重點(diǎn)主要集中在產(chǎn)生和管理一個(gè)獨(dú)立對(duì)象上,而且不允許產(chǎn)生另一個(gè)這樣的對(duì)象。
先讓我們看看一般的C++實(shí)現(xiàn)的基本手法,下面是實(shí)現(xiàn)源碼: // Singleton.h文件中 class Singleton { public: static Singleton& Instance() { if(!pInstance_){ if(destroyed_){ // 引用是否已經(jīng)失效 OnDeadReference(); } else { Create(); // 第一次時(shí)創(chuàng)建實(shí)例 } } return *pInstance_; } private: Singleton(); // 禁止默認(rèn)構(gòu)造 Singleton(const Singleton&); // 禁止拷貝構(gòu)造 Singleton& operator= (const Singleton&);  // 禁止賦值操作 static void Create() // 傳加創(chuàng)建的實(shí)例引用 { static Singleton theInstance; pInstance_ = &theInstance; } static void OnDeadReference() { throw std::runtime_error(" 實(shí)例被不正當(dāng)消毀"); } virtual ~Singleton() { pInstance- = 0; destroyed_ = true; } static Singleton *pInstance_; static bool destroyed_; } // Singleton.cpp中靜態(tài)成員變量初始化 Singleton* Singleton::pInstance_ = 0; Bool Singleton::destroyed_ = false; ??? 如上所示,Singleton模式實(shí)現(xiàn)中只有一個(gè)public成員Instance()用來(lái)第一次使用時(shí)創(chuàng)建單一實(shí)例,當(dāng)?shù)诙问褂脮r(shí)靜態(tài)變量將已經(jīng)被設(shè)定好,不會(huì)再次創(chuàng)建實(shí)例。還將默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和賦值操作符放在private中,目地是不讓用戶(hù)使用它們。另外,為避免實(shí)例意外消毀后再實(shí)例化情況,加入靜態(tài)布爾變量destroy_來(lái)進(jìn)行判斷是否出錯(cuò),從而達(dá)到穩(wěn)定性。
??? 從上面一般實(shí)現(xiàn)可以看出Singleton模式實(shí)現(xiàn)主要在于創(chuàng)建(Creation)方面和生存期(Lifetime)方面,既可以通過(guò)各種方法來(lái)創(chuàng)建Singleton。Creation必然能創(chuàng)建和摧毀對(duì)象,必然要開(kāi)放這兩個(gè)相應(yīng)函數(shù),將創(chuàng)建作為獨(dú)立策略分離開(kāi)來(lái)是必需的,這樣你就可以創(chuàng)建多態(tài)對(duì)象了,所以泛化Singleton并不擁有Creator對(duì)象,它被放在CreationPolicy<T>類(lèi)模板之中。生命期是指要遵循C++規(guī)則,后創(chuàng)建都先摧毀,負(fù)責(zé)程序生命期某一時(shí)刻摧毀Singleton對(duì)象。

下面是一個(gè)簡(jiǎn)單的泛化Singleton模式的實(shí)現(xiàn)(不考慮線(xiàn)程因素) template < class T, template<class> calss CreationPolicy = CreateUsingNew, template<class> class LifetimePolicy=DefaultLifetime, > classs SingletonHolder { public: static T& Instance() { if(!pInstance_) { if(destroyed_) { LifetimePolicy<T>::OnDeadReference(); destroyed_ = false; } pInstance_ = CreationPolicy<T>::Create(); LifetimePolicy<T>::SchedultCall(&DestorySingleton); } return *pInstance_; } private: static void DestroySinleton() { assert(!destroyed_); CreationPlicy<T>::Destroy(pInstance_); pInstance_ = 0; destroyed_ = true; } SingletonHolder(); SingletonHolder (const SingletonHolder &); SingletonHolder & operator= (const SingletonHolder &);  Static T* pInstance_; Static bool destroyed_; }; ??? Instance()是SingletonHolder開(kāi)放的唯一一個(gè)public函數(shù),它在CreationPolicy、LifetimePolicy中打造了一層外殼。其中模板參數(shù)類(lèi)型T,接收類(lèi)名,既需要進(jìn)行Singleton的類(lèi)。模板參數(shù)內(nèi)的類(lèi)模板缺省參數(shù)CreateUsingNew是指通過(guò)new操作符和默認(rèn)構(gòu)造函數(shù)來(lái)產(chǎn)生對(duì)象,DefaultLifetime是通過(guò)C++規(guī)則來(lái)管理生命期。LifetimePolicy<T>中有二個(gè)成員函數(shù),ScheduleDestrution()函數(shù)接受一個(gè)函數(shù)指針,指向析構(gòu)操作的實(shí)際執(zhí)行函數(shù),如上面DestorySingleton析構(gòu)函數(shù);OnDeadReference()函數(shù)同上面一般C++中同名函數(shù)相同,是負(fù)責(zé)發(fā)現(xiàn)失效實(shí)例來(lái)拋出異常的。CreationPlicy<T>中的Create()和Destroy()兩函數(shù)是用來(lái)創(chuàng)建并摧毀具體對(duì)象的。

下面是上述泛化Singleton模式實(shí)現(xiàn)的使用:

1、應(yīng)用一 class A{}; typedef SingletonHolder<A, CreateUsingNew> SingleA; 2、應(yīng)用二 class A{}; class Derived : public A {}; template<class T> struct MyCreator : public CreateUsingNew<T> { static T* Create() { return new Derived; } static void Destroy(T* pInstance) { delete pInstance; } } typedef SingletonHolder<A,MyCreator> SingleA; ??? 通過(guò)上面示例可以看出, SingletonHolder采用基于plicy設(shè)計(jì)實(shí)現(xiàn),它將Singleton對(duì)象分解為數(shù)個(gè)policies,模板參數(shù)類(lèi)中CreationPolicy和LifetimePolicy相當(dāng)于二個(gè)policies封裝體。利用它們可以協(xié)助制作出使用者自定義的Singleton對(duì)象,同時(shí)還預(yù)留了調(diào)整和擴(kuò)展的空間。由此而得,泛型組件(generic components),是一種可復(fù)用的設(shè)計(jì)模板,結(jié)合了模板和模式,是C++中創(chuàng)造可擴(kuò)充設(shè)計(jì)的新方法,提供了從設(shè)計(jì)到代碼的簡(jiǎn)易過(guò)渡,幫助我們編寫(xiě)清晰、靈活、高度可復(fù)用的代碼。

參考文獻(xiàn)
  • C++ Primer(第三版) --- 潘愛(ài)民等譯
  • Effective C++(第二版) --- 侯捷譯
  • More Effective C++ --- 侯捷譯
  • Exceptional C++ --- 卓小濤譯
  • More Exceptional C++ --- 於春景譯
  • 深度探索C++對(duì)象模型 --- 侯捷譯
  • 泛型編程與STL --- 侯捷譯
  • C++ STL程序員開(kāi)發(fā)指南 --- 彭木根等箸
  • 設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖脑?--- 李英軍等譯
  • C++設(shè)計(jì)新思維 --- 侯捷等譯

posted on 2007-01-04 15:07 木木頭 閱讀(403) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++特性

導(dǎo)航

<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計(jì)

常用鏈接

留言簿(3)

隨筆分類(lèi)(29)

搜索

最新隨筆

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产女主播视频一区二区| 日韩视频一区二区三区在线播放| 国内精品一区二区三区| 久久久久99| 亚洲国产高清在线| 亚洲视频大全| 国产一区二区按摩在线观看| 久久久久久久国产| 亚洲精品中文字幕女同| 午夜精品一区二区三区在线播放| 国产午夜精品美女毛片视频| 麻豆精品网站| 亚洲性色视频| 欧美电影在线观看完整版| 国产精品99久久久久久久女警| 国产毛片一区二区| 欧美14一18处毛片| 亚洲伊人观看| 亚洲国产精品成人va在线观看| 亚洲视频1区2区| 在线日韩av| 国产精品一二一区| 欧美电影电视剧在线观看| 亚洲午夜视频| 欧美高清视频一区| 欧美在线观看视频| 一本色道久久综合亚洲精品高清| 国产视频久久网| 欧美人成在线视频| 久久久午夜电影| 亚洲一区欧美二区| 最近看过的日韩成人| 久久久久久久综合| 亚洲一区二区三区高清 | 美腿丝袜亚洲色图| 亚洲永久在线观看| 亚洲精品一级| 一区二区在线看| 国产精品午夜在线| 欧美日韩国产区一| 另类综合日韩欧美亚洲| 欧美亚洲日本一区| 亚洲图片在线| 亚洲人成亚洲人成在线观看| 久久一区二区三区超碰国产精品| 午夜一级在线看亚洲| 一区二区三区色| 最新国产精品拍自在线播放| 国产综合色在线| 国产欧美1区2区3区| 欧美视频一区| 欧美日韩国产一级片| 免费国产一区二区| 老司机精品久久| 久久久久女教师免费一区| 校园春色国产精品| 亚洲欧美成人一区二区在线电影 | 久久不射网站| 午夜精品www| 亚洲欧美999| 亚洲永久免费观看| 亚洲一区二区免费看| 亚洲视频综合在线| 亚洲一级片在线观看| 正在播放亚洲一区| 亚洲午夜久久久久久久久电影院| 99国产精品久久久久久久| 99国产精品国产精品久久| 亚洲精品在线观看免费| 日韩一级免费| 亚洲一区二区视频在线观看| 亚洲视频1区| 亚洲欧美国产一区二区三区| 性色av一区二区三区在线观看| 亚洲欧美日产图| 欧美一区二区久久久| 欧美在线视频免费播放| 久久久久久夜| 欧美顶级大胆免费视频| 欧美日韩国产另类不卡| 欧美视频一区二区三区…| 国产精品久久久一本精品| 国产欧美一区二区精品性| 黑人巨大精品欧美一区二区 | 久久亚洲综合网| 欧美大片网址| 欧美日韩中文在线观看| 国产精品网站在线播放| 国内揄拍国内精品少妇国语| 亚洲高清影视| 亚洲视频国产视频| 久久丁香综合五月国产三级网站| 久久婷婷丁香| 亚洲激情欧美激情| 亚洲在线观看视频网站| 久久精品噜噜噜成人av农村| 欧美成人免费视频| 欧美午夜精品伦理| 韩曰欧美视频免费观看| 亚洲精品极品| 欧美亚洲一区三区| 欧美激情 亚洲a∨综合| 一本一本久久a久久精品牛牛影视| 午夜一级久久| 欧美电影在线观看| 国产欧美一区二区三区另类精品| 亚洲第一天堂av| 亚洲女人小视频在线观看| 美女久久一区| 亚洲午夜一区二区| 蜜臀久久99精品久久久久久9 | 免费在线国产精品| 国产精品区二区三区日本| 亚洲第一在线综合网站| 亚洲在线不卡| 欧美国产一区二区| 亚洲在线观看视频网站| 欧美韩日一区二区| 国产一区二区精品丝袜| 亚洲私人影吧| 欧美国产视频在线观看| 午夜免费日韩视频| 欧美日韩一区二区在线观看| 尤物yw午夜国产精品视频明星| 亚洲一区二区三区影院| 亚洲大胆人体在线| 午夜精品视频在线观看| 欧美色道久久88综合亚洲精品| 亚洲成人在线视频网站| 欧美一区视频| 国产精品99久久久久久久久| 欧美大色视频| 激情综合亚洲| 久久久国产一区二区| 中文精品视频一区二区在线观看| 欧美jizz19性欧美| 伊人成人网在线看| 久久精品在线观看| 亚洲伊人久久综合| 国产精品国产精品| 在线视频你懂得一区| 亚洲国产精品成人精品| 久久一区二区三区超碰国产精品| 国产精品有限公司| 亚洲综合色自拍一区| 日韩视频―中文字幕| 欧美精品一区二区蜜臀亚洲| 亚洲激情二区| 欧美高清视频www夜色资源网| 久久精品99国产精品日本| 国产女人精品视频| 欧美一区二区大片| 亚洲欧美伊人| 国产拍揄自揄精品视频麻豆| 欧美一级一区| 亚洲欧美日韩国产成人| 国产精品夜色7777狼人| 欧美在线视频免费播放| 午夜日韩av| 国产一区二区三区无遮挡| 久久久精品国产免费观看同学| 午夜精品福利电影| 国产一区二区无遮挡| 久久久久网站| 久久人人爽爽爽人久久久| 在线精品国产成人综合| 欧美黄色成人网| 欧美精品久久99| 亚洲图片欧美一区| 亚洲在线黄色| 国产亚洲欧美一级| 免费观看成人鲁鲁鲁鲁鲁视频 | 在线观看福利一区| 欧美电影在线观看完整版| 欧美高清视频一区二区| 夜夜嗨av一区二区三区| 亚洲视频www| 国产一区视频观看| 欧美1区视频| 欧美屁股在线| 欧美一区二区精品| 久久九九精品| 99视频精品| 亚洲香蕉在线观看| 狠狠爱综合网| 91久久精品视频| 国产精品女人毛片| 免费国产自线拍一欧美视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲人成网站色ww在线| 国产精品国产三级国产专播品爱网 | 国产精品第三页| 久久久久久一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 99亚洲精品| 欧美一区二区视频在线观看| 亚洲精品网址在线观看| 亚洲欧美另类在线| 亚洲欧洲日本mm| 午夜国产精品视频免费体验区|