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

posts - 297,  comments - 15,  trackbacks - 0

原 : http://feeds.feedburner.com/~r/Tony987/~3/14440522/

1、什么是const?
   常類型是指使用類型修飾符const說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌摹#ó?dāng)然,我們可以偷梁換柱進行更新:)

2、為什么引入const?
  const 推出的初始目的,正是為了取代預(yù)編譯指令,消除它的缺點,同時繼承它的優(yōu)點。

3、cons有什么主要的作用?
   (1)可以定義const常量,具有不可變性。
        例如:
             const int Max=100;
             int Array[Max];        
   (2)便于進行類型檢查,使編譯器對處理內(nèi)容有更多了解,消除了一些隱患。
例如:
             void f(const int i) { .........}
        編譯器就會知道i是一個常量,不允許修改;
   (3)可以避免意義模糊的數(shù)字出現(xiàn),同樣可以很方便地進行參數(shù)的調(diào)整和修改。
        同宏定義一樣,可以做到不變則已,一變都變!如(1)中,如果想修改Max的內(nèi)容,只需要:const int Max=you want;即可!
   (4)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。
        還是上面的例子,如果在函數(shù)體內(nèi)修改了i,編譯器就會報錯;
        例如:
             void f(const int i) { i=10;//error! }
    (5) 為函數(shù)重載提供了一個參考。
         class A
         {
           ......
           void f(int i)       {......} file://一個函數(shù)
           void f(int i) const {......} file://上一個函數(shù)的重載
            ......
          };
     (6) 可以節(jié)省空間,避免不必要的內(nèi)存分配。
         例如:
              #define PI 3.14159         file://常量宏
              const doulbe  Pi=3.14159;  file://此時并未將Pi放入ROM中
              ......
              double i=Pi;               file://此時為Pi分配內(nèi)存,以后不再分配!
              double I=PI;               file://編譯期間進行宏替換,分配內(nèi)存
              double j=Pi;               file://沒有內(nèi)存分配
              double J=PI;               file://再進行宏替換,又一次分配內(nèi)存!
         const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內(nèi)存中有若干個拷貝。
     (7) 提高了效率。
           編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內(nèi)存的操作,使得它的效率也很高。

3、如何使用const?
   (1)修飾一般常量
     一般常量是指簡單類型的常量。這種常量在定義時,修飾符const可以用在類型說明符前,也可以用在類型說明符后。
       例如:   
           int const x=2;  或  const int x=2;
   (2)修飾常數(shù)組
       定義或說明一個常數(shù)組可采用如下格式:
       int const a[5]={1, 2, 3, 4, 5}; 
         const int a[5]={1, 2, 3, 4, 5};
   (3)修飾常對象
      常對象是指對象常量,定義格式如下:
           class A;
       const A a;
           A const a;
      定義常對象時,同樣要進行初始化,并且該對象不能再被更新,修飾符const可以放在類名后面,也可以放在類名前面。 
   (4)修飾常指針
        const int *A;        file://const修飾指向的對象,A可變,A指向的對象不可變
        int const *A;       file://const修飾指向的對象,A可變,A指向的對象不可變
        int *const A;       file://const修飾指針A,     A不可變,A指向的對象可變
        const int *const A;  file://指針A和A指向的對象都不可變
   (5)修飾常引用
        使用const修飾符也可以說明引用,被說明的引用為常引用,該引用所引用的對象不能被更新。其定義格式如下:
       const double & v;
  (6)修飾函數(shù)的常參數(shù)
        const修飾符也可以修飾函數(shù)的傳遞參數(shù),格式如下:
        void Fun(const int Var);
        告訴編譯器Var在函數(shù)體中的無法改變,從而防止了使用者的一些無意的或錯誤的修改。     
   (7)修飾函數(shù)的返回值:
        const修飾符也可以修飾函數(shù)的返回值,是返回值不可被改變,格式如下:
            const int Fun1();
            const MyClass Fun2();
   (8)修飾類的成員函數(shù):
        const修飾符也可以修飾類的成員函數(shù),格式如下:
            class ClassName
     {
             public:
                  int Fun() const;
                    .....
             };
        這樣,在調(diào)用函數(shù)Fun時就不能修改類里面的數(shù)據(jù)
    (9)在另一連接文件中引用const常量
         extern const int i;     file://正確的引用
         extern const int j=10;  file://錯誤!常量不可以被再次賦值
    另外,還要注意,常量必須初始化!
         例如:
             const int i=5;  

4、幾點值得討論的地方:
   (1)const究竟意味著什么?
        說了這么多,你認(rèn)為const意味著什么?一種修飾符?接口抽象?一種新類型?
        也許都是,在Stroustup最初引入這個關(guān)鍵字時,只是為對象放入ROM做出了一種可能,對于const對象,C++既允許對其進行靜態(tài)初始化,也允許對他進行動態(tài)初始化。理想的const對象應(yīng)該在其構(gòu)造函數(shù)完成之前都是可寫的,在析夠函數(shù)執(zhí)行開始后也都是可寫的,換句話說,const對象具有從構(gòu)造函數(shù)完成到析夠函數(shù)執(zhí)行之前的不變性,如果違反了這條規(guī)則,結(jié)果都是未定義的!雖然我們把const放入ROM中,但這并不能夠保證const 的任何形式的墮落,我們后面會給出具體的辦法。無論const對象被放入ROM中,還是通過存儲保護機制加以保護,都只能保證,對于用戶而言這個對象沒有改變。換句話說,廢料收集器(我們以后會詳細討論,這就一筆帶過)或數(shù)據(jù)庫系統(tǒng)對一個const的修改怎沒有任何問題。
   (2)位元const V.S. 抽象const?
        對于關(guān)鍵字const的解釋有好幾種方式,最常見的就是位元const 和 抽象const。下面我們看一個例子:
        class A
        {
         public:
               ......
               A f(const A& a);
               ......
         };
         如果采用抽象const進行解釋,那就是f函數(shù)不會去改變所引用對象的抽象值,如果采用位元const進行解釋,那就成了f函數(shù)不會去改變所引用對象的任何位元。
         我們可以看到位元解釋正是c++對const問題的定義,const成員函數(shù)不被允許修改它所在對象的任何一個數(shù)據(jù)成員。
         為什么這樣呢?因為使用位元const有2個好處:
         最大的好處是可以很容易地檢測到違反位元const規(guī)定的事件:編譯器只用去尋找有沒有對數(shù)據(jù)成員的賦值就可以了。另外,如果我們采用了位元 const,那么,對于一些比較簡單的const對象,我們就可以把它安全的放入ROM中,對于一些程序而言,這無疑是一個很重要的優(yōu)化方式。(關(guān)于優(yōu)化處理,我們到時候?qū)iT進行討論)
         當(dāng)然,位元const也有缺點,要不然,抽象const也就沒有產(chǎn)生的必要了。
         首先,位元const的抽象性比抽象const的級別更低!實際上,大家都知道,一個庫接口的抽象性級別越低,使用這個庫就越困難。
         其次,使用位元const的庫接口會暴露庫的一些實現(xiàn)細節(jié),而這往往會帶來一些負(fù)面效應(yīng)。所以,在庫接口和程序?qū)崿F(xiàn)細節(jié)上,我們都應(yīng)該采用抽象const。
         有時,我們可能希望對const做出一些其它的解釋,那么,就要注意了,目前,大多數(shù)對const的解釋都是類型不安全的,這里我們就不舉例子了,你可以自己考慮一下,總之,我們盡量避免對const的重新解釋。
   (3)放在類內(nèi)部的常量有什么限制?
        看看下面這個例子:
        class A
        {
         private:
           const int c3 = 7;           // ???
       static int c4 = 7;          // ???
       static const float c5 = 7;  // ???
          ......
  };
         你認(rèn)為上面的3句對嗎?呵呵,都不對!使用這種類內(nèi)部的初始化語法的時候,常量必須是被一個常量表達式初始化的整型或枚舉類型,而且必須是static和const形式。這顯然是一個很嚴(yán)重的限制!
         那么,我們的標(biāo)準(zhǔn)委員會為什么做這樣的規(guī)定呢?一般來說,類在一個頭文件中被聲明,而頭文件被包含到許多互相調(diào)用的單元去。但是,為了避免復(fù)雜的編譯器規(guī)則,C++要求每一個對象只有一個單獨的定義。如果C++允許在類內(nèi)部定義一個和對象一樣占據(jù)內(nèi)存的實體的話,這種規(guī)則就被破壞了。
    (4)如何初始化類內(nèi)部的常量?
         一種方法就是static 和 const 并用,在內(nèi)部初始化,如上面的例子;
         另一個很常見的方法就是初始化列表:
         class A
         {
          public:
                A(int i=0):test(i) {}
          private:
                const int i;
          };
          還有一種方式就是在外部初始化,例如:
         class A
         {
          public:
                A() {}
          private:
                static const int i;  file://注意必須是靜態(tài)的!
          };
          const int A::i=3;
     (5)常量與數(shù)組的組合有什么特殊嗎?
          我們給出下面的代碼:
           const int size[3]={10,20,50};
           int array[size[2]];
           有什么問題嗎?對了,編譯通不過!為什么呢?
           const可以用于集合,但編譯器不能把一個集合存放在它的符號表里,所以必須分配內(nèi)存。在這種情況下,const意味著“不能改變的一塊存儲”。然而,其值在編譯時不能被使用,因為編譯器在編譯時不需要知道存儲的內(nèi)容。自然,作為數(shù)組的大小就不行了:)
         你再看看下面的例子:
          class A
         {
          public:
                A(int i=0):test[2]({1,2}) {} file://你認(rèn)為行嗎?
          private:
                const int test[2];
          };
         vc6下編譯通不過,為什么呢?
         關(guān)于這個問題,前些時間,njboy問我是怎么回事?我反問他:“你認(rèn)為呢?”他想了想,給出了一下解釋,大家可以看看:我們知道編譯器堆初始化列表的操作是在構(gòu)造函數(shù)之內(nèi),顯式調(diào)用可用代碼之前,初始化的次序依據(jù)數(shù)據(jù)聲明的次序。初始化時機應(yīng)該沒有什么問題,那么就只有是編譯器對數(shù)組做了什么手腳!其實做什么手腳,我也不知道,我只好對他進行猜測:編譯器搜索到test發(fā)現(xiàn)是一個非靜態(tài)的數(shù)組,于是,為他分配內(nèi)存空間,這里需要注意了,它應(yīng)該是一下分配完,并非先分配test[0],然后利用初始化列表初始化,再分配test[1],這就導(dǎo)致數(shù)組的初始化實際上是賦值!然而,常量不允許賦值,所以無法通過。
        呵呵,看了這一段冠冕堂皇的話,真讓我笑死了!njboy別怪我揭你短呀:)我對此的解釋是這樣的:C++標(biāo)準(zhǔn)有一個規(guī)定,不允許無序?qū)ο笤陬悆?nèi)部初始化,數(shù)組顯然是一個無序的,所以這樣的初始化是錯誤的!對于他,只能在類的外部進行初始化,如果想讓它通過,只需要聲明為靜態(tài)的,然后初始化。
         這里我們看到,常量與數(shù)組的組合沒有什么特殊!一切都是數(shù)組惹的禍!
   (6)this指針是不是const類型的?
        this指針是一個很重要的概念,那該如何理解她呢?也許這個話題太大了,那我們縮小一些:this指針是個什么類型的?這要看具體情況:如果在非 const成員函數(shù)中,this指針只是一個類類型的;如果在const成員函數(shù)中,this指針是一個const類類型的;如果在volatile成員函數(shù)中,this指針就是一個volatile類類型的。
   (7)const到底是不是一個重載的參考對象?
        先看一下下面的例子:
        class A
         {
           ......
           void f(int i)       {......} file://一個函數(shù)
           void f(int i) const {......} file://上一個函數(shù)的重載
            ......
          };
        上面是重載是沒有問題的了,那么下面的呢?
         class A
         {
           ......
           void f(int i)       {......} file://一個函數(shù)
           void f(const int i) {......} file://?????
            ......
         };
         這個是錯誤的,編譯通不過。那么是不是說明內(nèi)部參數(shù)的const不予重載呢?再看下面的例子:
        class A
         {
           ......
           void f(int& )       {......} file://一個函數(shù)
           void f(const int& ) {......} file://?????
            ......
         };
         這個程序是正確的,看來上面的結(jié)論是錯誤的。為什么會這樣呢?這要涉及到接口的透明度問題。按值傳遞時,對用戶而言,這是透明的,用戶不知道函數(shù)對形參做了什么手腳,在這種情況下進行重載是沒有意義的,所以規(guī)定不能重載!當(dāng)指針或引用被引入時,用戶就會對函數(shù)的操作有了一定的了解,不再是透明的了,這時重載是有意義的,所以規(guī)定可以重載。
   (8)什么情況下為const分配內(nèi)存?
        以下是我想到的可能情況,當(dāng)然,有的編譯器進行了優(yōu)化,可能不分配內(nèi)存。
        A、作為非靜態(tài)的類成員時;
        B、用于集合時;
        C、被取地址時;
        D、在main函數(shù)體內(nèi)部通過函數(shù)來獲得值時;
        E、const的 class或struct有用戶定義的構(gòu)造函數(shù)、析構(gòu)函數(shù)或基類時;。
        F、當(dāng)const的長度比計算機字長還長時;
        G、參數(shù)中的const;
        H、使用了extern時。
        不知道還有沒有其他情況,歡迎高手指點:)        
   (9)臨時變量到底是不是常量?
        很多情況下,編譯器必須建立臨時對象。像其他任何對象一樣,它們需要存儲空間而且必須被構(gòu)造和刪除。區(qū)別是我們從來看不到編譯器負(fù)責(zé)決定它們的去留以及它們存在的細節(jié)。對于C++標(biāo)準(zhǔn)草案而言:臨時對象自動地成為常量。因為我們通常接觸不到臨時對象,不能使用與之相關(guān)的信息,所以告訴臨時對象做一些改變有可能會出錯。當(dāng)然,這與編譯器有關(guān),例如:vc6、vc7都對此作了擴展,所以,用臨時對象做左值,編譯器并沒有報錯。
   (10)與static搭配會不會有問題?
        假設(shè)有一個類:
        class A
        {
         public:
             ......
             static void f() const { ......}
             ......
         };
         我們發(fā)現(xiàn)編譯器會報錯,因為在這種情況下static不能夠與const共存!
         為什么呢?因為static沒有this指針,但是const修飾this指針,所以...
     (11)如何修改常量?
          有時候我們卻不得不對類內(nèi)的數(shù)據(jù)進行修改,但是我們的接口卻被聲明了const,那該怎么處理呢?我對這個問題的看法如下:
           1)標(biāo)準(zhǔn)用法:mutable
              class A
              {
               public:
                      A(int i=0):test(i)        { }
                      void SetValue(int i)const { test=i; }
               private:
                      mutable int test;   file://這里處理!
               };
           2)強制轉(zhuǎn)換:const_cast
               class A
               {
               public:
                      A(int i=0):test(i)        { }
                      void SetValue(int i)const
                      { const_cast (test)=i; }//這里處理!
               private:
                      int test;   
               };
            3)靈活的指針:int*
               class A
              {
               public:
                      A(int i=0):test(i)        { }
                      void SetValue(int i)const
                      { *test=i; }
               private:
                      int* test;   file://這里處理!
               };
            4)未定義的處理
              class A
              {
               public:
                      A(int i=0):test(i)        { }
                      void SetValue(int i)const
                      { int *p=(int*)&test; *p=i; }//這里處理!
               private:
                      int test;   
               };
                注意,這里雖然說可以這樣修改,但結(jié)果是未定義的,避免使用!
             5)內(nèi)部處理:this指針
              class A
              {
               public:
                      A(int i=0):test(i)        { }
                      void SetValue(int i)const
                      { ((A*)this)->test=i; }//這里處理!
               private:
                      int test;   
               };
             6)最另類的處理:空間布局
               class A
               {
                public:
                      A(int i=0):test(i),c('a') {  }
                private:
                      char c;
                      const int test;
                };
                int main()
                {
                    A a(3);
                    A* pa=&a;
                    char* p=(char*)pa;     
                    int*  pi=(int*)(p+4);//利用邊緣調(diào)整
                    *pi=5;                 file://此處改變了test的值!
                    return 0;
                 }
        雖然我給出了6中方法,但是我只是想說明如何更改,但出了第一種用法之外,另外5種用法,我們并不提倡,不要因為我這么寫了,你就這么用,否則,我真是要誤人子弟了:)
     (12)最后我們來討論一下常量對象的動態(tài)創(chuàng)建。
           既然編譯器可以動態(tài)初始化常量,就自然可以動態(tài)創(chuàng)建,例如:
           const int* pi=new const int(10);
           這里要注意2點:
           1)const對象必須被初始化!所以(10)是不能夠少的。
           2)new返回的指針必須是const類型的。
           那么我們可不可以動態(tài)創(chuàng)建一個數(shù)組呢?
           答案是否定的,因為new內(nèi)置類型的數(shù)組,不能被初始化。
           這里我們忽視了數(shù)組是類類型的,同樣對于類內(nèi)部數(shù)組初始化我們也做出了這樣的忽視,因為這涉及到數(shù)組的問題,我們以后再討論。

posted on 2009-03-27 10:31 chatler 閱讀(248) 評論(0)  編輯 收藏 引用 所屬分類: C++_BASIS
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产视频一区在线| 久久久美女艺术照精彩视频福利播放| 欧美一级午夜免费电影| 亚洲国产成人久久综合| 午夜精品久久久久久久男人的天堂| 亚洲高清视频在线观看| 午夜欧美理论片| 亚洲一区二区三区乱码aⅴ| 久热精品视频| 久久婷婷麻豆| 国产情侣一区| 亚洲综合激情| 亚洲欧美日韩国产成人| 欧美日本免费| 亚洲精品乱码久久久久久蜜桃91| 国产一区二区三区的电影| 亚洲深夜影院| 亚洲性图久久| 欧美日韩在线电影| 99国产精品私拍| 在线中文字幕一区| 欧美日韩一区二区三区四区五区| 亚洲高清av| 亚洲精品日韩久久| 欧美激情精品久久久久久蜜臀| 欧美韩国日本综合| 亚洲黄页一区| 欧美极品欧美精品欧美视频| 亚洲国产99| 日韩一级在线观看| 欧美日韩中文字幕综合视频| 99pao成人国产永久免费视频| 亚洲另类自拍| 欧美体内she精视频| 亚洲午夜视频在线| 久久久av水蜜桃| 伊人久久大香线蕉综合热线| 亚洲精品一区二区三区福利| 麻豆av一区二区三区久久| 欧美成人高清| 99视频精品全部免费在线| 欧美日韩美女| 亚洲一区在线免费| 久久综合给合| 亚洲精品乱码久久久久久| 欧美人与禽猛交乱配视频| 在线视频精品一区| 久久精品99国产精品| 在线播放日韩| 欧美日韩视频免费播放| 亚洲视频www| 久久一区二区三区国产精品| 亚洲国产精品电影| 国产精品家庭影院| 久久精品最新地址| 亚洲国产视频一区二区| 亚洲女爱视频在线| 一区久久精品| 欧美日韩在线不卡一区| 久久精品中文字幕一区| 亚洲欧洲日产国产网站| 亚洲欧美日韩中文播放| 狠狠色狠狠色综合日日五| 欧美激情精品久久久久久蜜臀| 亚洲主播在线观看| 亚洲国产成人精品久久| 欧美亚洲综合久久| 亚洲肉体裸体xxxx137| 国产精品理论片| 欧美xx69| 久久国产精品久久久久久久久久| 亚洲精品老司机| 免费成人性网站| 午夜在线一区二区| 亚洲毛片一区| 1024国产精品| 国产日韩欧美在线播放不卡| 欧美精品在线观看| 久久久久久久综合狠狠综合| 亚洲性视频h| 亚洲精品国产精品国自产在线 | 欧美日韩在线播放一区| 久久国产精品久久久久久| 宅男噜噜噜66国产日韩在线观看| 欧美国产日本韩| 久久久久久亚洲精品中文字幕| 亚洲特色特黄| 日韩视频在线免费观看| 亚洲国产精品福利| 国内精品久久久久久久97牛牛| 欧美性理论片在线观看片免费| 免费亚洲视频| 玖玖玖免费嫩草在线影院一区| 欧美中文字幕第一页| 亚洲一区二区欧美日韩| 9l国产精品久久久久麻豆| 亚洲片在线观看| 亚洲黄色av一区| 欧美高清视频一区二区三区在线观看 | 亚洲另类在线视频| 在线观看不卡| 激情偷拍久久| 一区在线免费观看| 又紧又大又爽精品一区二区| 国产丝袜美腿一区二区三区| 国产精品萝li| 国产精品久久久亚洲一区| 国产精品v欧美精品v日韩精品| 欧美日韩一区二区三区在线视频 | 久久精品30| 欧美一区二区三区播放老司机| 国产精品午夜久久| 国产精品女主播| 国产精品亚洲人在线观看| 国产精品电影在线观看| 国产精品一二三视频| 国产精品久久久久aaaa| 国产精品爽爽爽| 国产欧美日韩精品一区| 国产一区二区三区在线观看精品| 国产无一区二区| 好看的av在线不卡观看| 韩国成人福利片在线播放| 在线免费高清一区二区三区| 亚洲春色另类小说| 日韩视频免费看| 亚洲桃花岛网站| 久久精品91| 欧美国产日韩一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲尤物在线| 欧美在线精品免播放器视频| 久久久久久亚洲综合影院红桃| 久久午夜影视| 欧美日韩系列| 国产一区二区三区久久精品| 91久久国产综合久久| 在线午夜精品自拍| 欧美一级黄色网| 欧美www视频| 夜夜躁日日躁狠狠久久88av| 欧美一级免费视频| 欧美黄色aa电影| 国产精品视频你懂的| 亚洲成人资源| 亚洲在线观看视频| 蜜桃av一区二区三区| 99re8这里有精品热视频免费| 午夜影视日本亚洲欧洲精品| 免费国产自线拍一欧美视频| 国产精品久久久久久久午夜 | 久久久久久亚洲精品中文字幕| 亚洲第一偷拍| 亚洲欧美日韩国产一区| 嫩模写真一区二区三区三州| 国产美女精品一区二区三区| 亚洲人成人一区二区三区| 欧美亚洲日本国产| 91久久精品国产91性色| 欧美一级免费视频| 欧美性大战xxxxx久久久| 影音先锋亚洲一区| 午夜精品美女久久久久av福利| 欧美激情在线观看| 欧美与欧洲交xxxx免费观看| 欧美日韩国产综合视频在线观看中文 | 久久国产精品久久久| 亚洲第一页中文字幕| 午夜在线a亚洲v天堂网2018| 欧美日韩免费观看中文| 在线精品亚洲| 久久久久久久欧美精品| 一区二区欧美在线| 欧美精品电影| 亚洲激情网站| 免费国产自线拍一欧美视频| 亚洲综合欧美日韩| 欧美日韩中文另类| 艳女tv在线观看国产一区| 欧美大尺度在线| 久久天天狠狠| 黄色另类av| 久久综合999| 欧美在线亚洲在线| 国产日韩欧美视频| 欧美在线免费看| 亚洲摸下面视频| 国产精品久久久久久久久免费桃花 | 91久久精品国产91性色tv| 久久久噜噜噜久久| 久久av在线看| 国产综合欧美| 久久久综合激的五月天| 欧美一区午夜视频在线观看| 国产精品视频免费观看www| 性欧美大战久久久久久久免费观看| aa级大片欧美| 国产精品红桃| 午夜在线一区| 欧美专区日韩专区|