3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

SCAU软件开发基础C++复习

發布時間:2023/12/18 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SCAU软件开发基础C++复习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++語言程序設計(第4版)

文章目錄

  • C++語言程序設計(第4版)
    • 第一章 緒論
      • 1.1 面向對象的基本概念
        • 1.1.1 對象
        • 1.1.2 類(數據類型)
        • 1.1.3 封裝
        • 1.1.4 繼承
        • 1.1.5 多態性
    • 第二章 C++簡單程序設計
      • 2.1 C++的特點
      • 2.2 基本數據類型
      • 2.3 變量的存儲類型
      • 2.4 運算方式和表達式
        • 2.4.1 算數運算式與算數表達式
        • 2.4.2 賦值運算符與賦值表達式
        • 2.4.3 逗號運算和逗號表達式
        • 2.4.4 邏輯運算與邏輯表達式
        • 2.4.5 條件運算符與條件表達式
        • 2.4.6 sizeof運算符
        • 2.4.7 位運算
    • 第三章 函數
        • 3.1 函數的定義與使用
        • 3.2 內聯函數
        • 3.3 帶默認參數值的函數
          • 3.3.1 有默認參數值的形參必須放在最后:
          • 3.3.2 在相同的作用域內,不允許在用一個函數的多個生命中對同一個參數的默認值重復定義,即使前后定義的值相同也不行:
        • 3.4 函數重載
        • 3.5 補充
    • 第四章 類與對象
      • 4.1 面向對象程序設計的基本特點
        • 4.1.1 抽象
        • 4.1.2 封裝
        • 4.1.3 繼承
        • 4.1.4 多態
      • 4.2 類和對象
        • 4.2.1 類的定義
        • 4.2.2 內聯成員函數
      • 4.3構造函數和析構函數
        • 4.3.1 構造函數
        • 4.3.2 復制構造函數
        • 4.3.3 析構函數
      • 4.4類的組合
        • 4.4.1 組合
        • 4.4.2 前向引用聲明
      • 4.5 結構體和聯合體
        • 4.5.1 結構體
        • 4.5.2 聯合體
    • 第五章 數據的共享與保護
      • 5.1 標識符的作用域與可見性
        • 5.1.1 作用域
          • 1.函數原型作用域:
          • 2.局部作用域:
          • 3.類作用域:
          • 4.命名空間作用域:
        • 5.1.2 可見性
      • 5.2 對象的生存期
        • 5.2.1 靜態生存期
        • 5.2.2 動態生存期
      • 5.3 類的靜態成員
        • 5.3.1 靜態數據成員
        • 5.3.2 靜態函數成員
      • 5.4 類的友元
        • 5.4.1 友元函數
        • 5.4.2 友元類
      • 5.5 共享數據的保護
        • 5.5.1 常對象
        • 5.5.2 用const修飾的類成員
          • 1.常成員函數
          • 2.常數據成員
          • 3.常飲用
      • 5.6 多文件結構和編譯預處理命令
          • 5.6.1 C++的一般組織結構
          • 5.6.2 外部變量和外部函數
          • 5.6.3標準C++庫
    • 第六章 數組、指針與字符串
      • 6.1 數組
        • 6.1.1數組的聲明
        • 6.1.2 數組的存儲和初始化
        • 6.1.3 數組作為函數參數
        • 6.1.4 對象數組
      • 6.2 指針
        • 6.2.1 內存空間的訪問方式
        • 6.2.2 指針變量的聲明
        • 6.2.3 與地址相關的運算“*”和“&”
        • 6.2.4 指針的賦值
          • 指向常量的指針
          • 指針類型的常量
        • 6.2.5 指針的運算
          • 關系運算
          • 賦值運算
        • 6.2.6 用指針處理數組元素
        • 6.2.7 指針數組
        • 6.2.8 用指針作為函數參數
        • 6.2.9 指針型函數
        • 6.2.10 指向函數的指針
        • 6.2.11 對象指針
          • 1.一般對象指針的概念
          • 2.this指針
          • 3.指向類的非靜態成員的指針
        • 4.指向類的靜態成員的指針
      • 6.3 動態內存分配
          • 6.3.1動態申請內存操作符new和釋放內存操作符delete
          • 6.3.2申請和釋放動態數組
            • 拓展
          • 6.3.3 動態創建多維數組
          • 6.3.4動態數組類
      • 6.4 用vector創建數組對象
      • 6.5 深復制和淺復制
        • 6.5.1 淺復制
        • 6.5.2 深復制
      • 6.6 字符串
        • 6.6.1 用字符數組存儲和處理字符串
          • 用字符數組表示字符串的缺點
        • 6.6.2 string類
      • 6.8 深度搜索
    • 第七章 繼承與派生
      • 7.1 類的繼承與派生
        • 7.1.1 概念
        • 7.1.2 派生類的定義
        • 7.1.3 派生類生成過程
          • 1.吸收基類成員
          • 2.改造基類成員
          • 3.添加新的成員
      • 7.2 訪問控制
        • 1.公有繼承
        • 2.私有繼承
        • 3.保護繼承
        • 4.私有繼承和保護繼承區別
      • 7.3 類型兼容規則
      • 7.4 派生類的構造、析構函數
        • 7.4.1 構造函數
        • 7.4.2 復制構造函數
        • 7.4.3 析構函數
      • 7.5 派生類成員的標識與訪問
        • 7.5.1 作用域分辨符(::)
        • 7.5.2 虛基類
        • 7.5.3 虛基類及其派生類構造函數
        • 拓展
      • 7.8 深度探索
    • 第八章 多態性
      • 8.1 多態性概述
        • 8.1.1 多態的類型
        • 8.1.2 多態的實現
      • 8.2 運算符重載
        • 8.2.1 運算符重載的規則
          • 兩種重載方式
          • 聲明形式
        • 8.2.2 運算符重載為成員函數
          • 雙目運算符 B
          • 前置單目運算符U
          • 后置單目運算符++、--
        • 8.2.3 運算符重載為非成員函數
          • 雙目運算符 B
          • 前置單目運算符 U
          • 后置單目運算符 ++和--
      • 8.3 虛函數
        • 8.3.1 一般虛函數成員
          • 運行過程中的多態必須滿足條件
        • 8.3.2 虛析構函數
      • 8.4 純虛函數與抽象類
      • 8.7 深度探索
    • 第九章 群體類和群體數據的組織
      • 9.1 函數模板與類模板
        • 9.1.1 函數模板
          • 注意
        • 9.1.2 類模板
      • 9.2 線性群體
        • 9.2.1 線性群體的概念
        • 9.2.2 直接訪問群體——數組類
          • 淺復制和深復制
          • 與眾不同的運算符
          • 指針轉換運算符的作用

第一章 緒論

1.1 面向對象的基本概念

1.1.1 對象

面向對象方法中的對象,是系統中用來描述客觀事務的一個主體,它是用來構成系統的一個基本單位。對象是由一組屬性和一組行為構成的。

1.1.2 類(數據類型)

分類所依據的原則是抽象。面向對象方法中的“類”,是具有相同屬性和服務的一組對象的集合。

1.1.3 封裝

封裝是面向對象方法中的一個重要原則,就是把對象的屬性和服務組合成一個獨立的系統單位,并盡可能隱蔽對象的內部細節。

1.1.4 繼承

特殊類的對象擁有其一般類的全部屬性與服務,稱做特殊類對一般類的繼承。

1.1.5 多態性

多態性是指一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同的數據類型或表現出不同的行為。

第二章 C++簡單程序設計

2.1 C++的特點

C++語言的主要特點是:1.盡量兼容C;2.支持面向對象的方法。

x.cpp:源程序,x.obj:目標程序,x.exe:執行程序。

2.2 基本數據類型

類型名長度(字節)取值范圍
bool1false,true
char1-128~127
signed char1-128~127
unsigned char10~255
short(signed short)2-32768~32767
unsigned short20~65535
int(signed int)4-2147483648~2147483647
unsigned int40~4294967295
long(signed long)4-2147483648~2147483647
unsigned long40~4294967295
float43.4x10(-38)~3.4x1038
double81.7x10(-308)~1.7x10308
long double81.7x10(-308)~1.7x10308

一般而言,如果對一個整數所占字節數和取值范圍沒有特殊要求,使用int型為宜,因為它通常具有最高的處理效率。

2.3 變量的存儲類型

auto:暫時性存儲。采用堆棧方式分配內存空間,其存儲空間可以被若干變量多次覆蓋使用。

register:存放在通用寄存器中。

extern:在所有函數和程序段中都可以引用。

static:在內存中以固定地址存放,整個程序運行期間都有效。

2.4 運算方式和表達式

2.4.1 算數運算式與算數表達式

2.4.2 賦值運算符與賦值表達式

2.4.3 逗號運算和逗號表達式

2.4.4 邏輯運算與邏輯表達式

優先級分兩級:(<,<=,>,>=) > (==,!=)。

“&&”和“||”具有“短路”特性,如果第一個操作數求值后為false,則不再對第二個操作數求值。

2.4.5 條件運算符與條件表達式

表達式1?表達式2:表達式3。

2.4.6 sizeof運算符

sizeof(類型名),用于計算某種類型的對象在內存中所占的字節數。

2.4.7 位運算

(1)按位與&:a=a&0xfe將a最低位變為0,c=a&0xff取出a的低字節;

(2)按位或|:a=a|0xff將a最低位變為1;

(3)按位異或^;

(4)按位取反~;

(5)移位<<或>>:2<<1=4,左邊表達式的值不會被改變。

第三章 函數

C++繼承了C語言的全部語法,也包括函數的定義與使用方法。

3.1 函數的定義與使用

主函數是程序執行的開始點,由主函數調用子函數,子函數還可以調用其他子函數。

3.1.1 函數的定義

形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據、影響函數功能的因素或者函數處理的結果作為形參。

只有函數被調用時才由主調函數將實際參數(實參)賦予形參。

一個函數可以有返回值,也可以沒有返回值,沒有返回值的時候類型標識符是void,可以不寫return語句,也可以寫一個不帶表達式的return表示結束當前函數的調用。

3.1.2 函數的調用

在調用函數前,要聲明或定義該函數。

3.1.3 函數的參數傳遞

值傳遞:單向傳遞;

引用傳遞:可以實現雙向傳遞,聲明引用的時候必須同時對它初始化,指向一個已存在的對象,并且不能更改;

常引用作參數可以保障實參數據的安全。

3.2 內聯函數

聲明時使用關鍵字 inline。

編譯時在調用處用函數體進行替換,節省了參數傳遞、控制轉移等開銷。
注意:

內聯函數應是比較簡單的函數。

內聯函數體內不能有循環語句和switch語句。

內聯函數的聲明必須出現在內聯函數第一次被調用之前。

對內聯函數不能進行異常接口聲明。

3.3 帶默認參數值的函數

3.3.1 有默認參數值的形參必須放在最后:

int add(int x, int y = 5, int z = 6);//正確

int add(int x = 1, int y = 5, int z);//錯誤

int add(int x = 1, int y, int z = 6);//錯誤

3.3.2 在相同的作用域內,不允許在用一個函數的多個生命中對同一個參數的默認值重復定義,即使前后定義的值相同也不行:
int add(int x = 5,int y = 6); //原型聲明在前 int main() {add(); } int add(int x,int y) { //此處不能再指定默認值return x + y; } int add(int x/* = 5*/,int y/* = 6*/) { //只有定義,沒有原型聲明return x + y; } int main() {add(); }

(好習慣:在參數表中以注釋來說明參數的默認值)

3.4 函數重載

定義:兩個以上的函數,具有相同的函數名,但是形參的個數或者類型不同,編譯器根據實參和形參的類型及個數的最佳匹配,自動確定調用哪一個函數。

重載函數的形參必須不同:個數不同或類型不同。

當使用具有默認形參值得函數重載形式時,需要注意防止二義性:

void fun(int length,int width = 2,int height = 33); void fun(int length);在調用的時候如果使用以下形式就會報錯: fun(1);

3.5 補充

在C++中聲明函數時后面括號內為空,表示的是要求的參數是未知的,如果沒有函數,后面括號內應該填上void。

第四章 類與對象

4.1 面向對象程序設計的基本特點

4.1.1 抽象

抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質并加以描述的過程。

抽象的實現:通過類的聲明。

4.1.2 封裝

封裝就是將抽象得到的數據和行為(或功能)相結合,形成一個有機整體,也就是將數據與操作數據的函數代碼進行有機的結合,形成“類”,其中的數據和函數都是類的成員。

實現封裝:類聲明中的{}。

4.1.3 繼承

實現:聲明派生類——見第7章

4.1.4 多態

多態:同一名稱,不同的功能實現方式。

目的:達到行為標識統一,減少程序中標識符的個數。

實現:重載函數和虛函數——見第8章

4.2 類和對象

在面向對象程序設計中,程序模塊是由類構成的。類是對邏輯上相關的函數與數據的封裝,它是對問題的抽象描述。

4.2.1 類的定義

類包括數據成員和函數成員

數據成員的訪問控制屬性有三種:public、protected、private

函數成員的訪問控制屬性有四種:public、protected、friendly、private

4.2.2 內聯成員函數

隱式聲明:將函數體放在類的聲明中。
顯式聲明:使用inline關鍵字。

4.3構造函數和析構函數

4.3.1 構造函數

構造函數的作用是在對象被創建時使用特定的值構造對象,將對象初始化為一個特定的初始狀態。
在對象創建時被自動調用
如果程序中未聲明,則系統自動產生出一個默認的構造函數,其參數列表為空。
構造函數可以是內聯函數、重載函數、帶默認參數值的函數。

4.3.2 復制構造函數

https://blog.csdn.net/shuaiyoutiao/article/details/121497260?spm=1001.2014.3001.5502

4.3.3 析構函數

析構函數是在對象的生存期即將結束的時刻被自動調用的。

析構函數不接受任何參數,但可以是虛函數。

4.4類的組合

4.4.1 組合

一個類中內嵌其他類的對象作為成員,它們之間的關系是一種包含與被包含的關系。

聲明形式:
類名::類名(對象成員所需的形參,本類成員形參)
:對象1(參數),對象2(參數),…
{
//函數體其他語句
}

組合類構造函數定義的一般形式是:

類名::類名(形參表):內嵌對象1(形參表),內嵌對象2(形參表)…

{類的初始化}

#include <iostream> #include <cmath> using namespace std; class Point { //Point類定義 public:Point(int xx = 0, int yy = 0) {x = xx;y = yy;}Point(Point &p);int getX() { return x; }//類外實現int getY() { return y; }//類外實現 private:int x, y; }; Point::Point(Point &p) { //復制構造函數的實現x = p.x;y = p.y;cout << "Calling the copy constructor of Point" << endl; } //類的組合 class Line { //Line類的定義 public: //外部接口Line(Point xp1, Point xp2);Line(Line &l);double getLen() { return len; } private: //私有數據成員Point p1, p2; //Point類的對象p1,p2double len; }; //組合類的構造函數 Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) {cout << "Calling constructor of Line" << endl; * double x = static_cast<double>(p1.getX() - p2.getX());//強制類型轉化double y = static_cast<double>(p1.getY() - p2.getY());//強制類型轉化len = sqrt(x * x + y * y); } Line::Line (Line &l): p1(l.p1), p2(l.p2) {//組合類的復制構造函數cout << "Calling the copy constructor of Line" << endl;len = l.len; } //主函數 int main() {Point myp1(1, 1), myp2(4, 5); //建立Point類的對象Line line(myp1, myp2); //建立Line類的對象Line line2(line); //利用復制構造函數建立一個新對象cout << "The length of the line is: ";cout << line.getLen() << endl;cout << "The length of the line2 is: ";cout << line2.getLen() << endl;return 0; }

生成兩個Point類的對象->構造Line類的對象line->復制構造line2->輸出兩點距離。在整個過程中Point類的復制構造函數被調用了6次,而且都是在Line類構造函數體之前進行的。

運行結果如下:
Calling the copy constructor of Point
Calling the copy constructor of Point
Calling the copy constructor of Point
Calling the copy constructor of Point
Calling constructor of Line
Calling the copy constructor of Point
Calling the copy constructor of Point
Calling the copy constructor of Line
The length of the line is: 5
The length of the line2 is: 5

4.4.2 前向引用聲明

例子:請定義兩個類A和B,其中A類中含有B類的對象b1, B類中含有A類的對象a1,編寫兩個類的構造函數和主函數,其中,在A類的構造函數中輸出“b1構造成功”, 在B類的構造函數中輸出“a1構造成功”;

#include <iostream>#include <cmath>using namespace std;class B;class A{public:A(){cout << "A默認構造成功" << endl;}A(int l){cout << "b1構造成功" << endl;}private:B *b;//只能聲明指針或引用,如果改為B b則編譯錯誤};class B{public:B(){cout << "B默認構造成功" << endl;}B(int l){cout << "a1構造成功" << endl;}private:A a;};int main(){A al(1);B b1(1);A a2;}

4.5 結構體和聯合體

4.5.1 結構體

結構體和類的唯一區別在于,結構體和類具有不同的默認訪問控制屬性,類是private,而結構體是public。

4.5.2 聯合體

聯合體的全部數據成員共享同一組內存單元,所以聯合體變量成員中至多只有一個有意義。

例:

#include <string> #include <iostream> using namespace std; class ExamInfo { private:string name; //課程名稱enum { GRADE, PASS, PERCENTAGE } mode;//采用何種計分方式union {char grade; //等級制的成績bool pass; //只記是否通過課程的成績int percent; //百分制的成績}; public://三種構造函數,分別用等級、是否通過和百分初始化ExamInfo(string name, char grade): name(name), mode(GRADE), grade(grade) { }ExamInfo(string name, bool pass): name(name), mode(PASS), pass(pass) { }ExamInfo(string name, int percent): name(name), mode(PERCENTAGE), percent(percent) { }void show(); } void ExamInfo::show() {cout << name << ": ";switch (mode) {case GRADE: cout << grade; break;case PASS: cout << (pass ? "PASS" : "FAIL"); break;case PERCENTAGE: cout << percent; break;}cout << endl; } int main() {ExamInfo course1("English", 'B');ExamInfo course2("Calculus", true);ExamInfo course3("C++ Programming", 85);course1.show();course2.show();course3.show();return 0; } 運行結果: English: B Calculus: PASS C++ Programming: 85

第五章 數據的共享與保護

5.1 標識符的作用域與可見性

5.1.1 作用域

作用域是一個標識符在程序正文中有效的區域。

1.函數原型作用域:

C++中最小的作用域,始于“(”,終于“)”,例double area(double radius);

2.局部作用域:
3.類作用域:

類X的成員m具有類作用域,訪問方法有三種:

第一種是如果在X的成員函數中沒有聲明同名的局部作用域標識符,那么在該函數內可以直接訪問成員m;

第二種是通過表達式x.m或X::m;

第三種是通過ptr->m,ptr為指向X類的一個對象的指針。

4.命名空間作用域:

例子

(具有命名空間作用域的變量也成為全局變量)

#include <iostream> using namespace std; int i; //全局變量,文件作用域 namespace Ns{int j; //在Ns命名空間中的全局變量 } int main() { i = 5; //為全局變量i賦值Ns::j=6; //為全局變量j賦值{ //子塊1using namespace Ns;//使得在當前塊空可以直接引用Ns命名空間的標識符int i; //局部變量,局部作用域i = 7;cout << "i = " << i << endl;//輸出7cout << "j = " << j << endl;//輸出6}cout << “i = ” << i << endl;//輸出5return 0; } 運行結果: i = 7 j = 6 i = 5

5.1.2 可見性

程序運行到某一點,能夠引用到的標識符,就是該處可見的標識符。

標識符應聲明在先,引用在后
如果某個標識符在外層中聲明,且在內層中沒有同一標識符的聲明,則該標識符在內層可見
對于兩個嵌套的作用域,如果在內層作用域內聲明了與外層作用域中同名的標識符,則外層作用域的標識符在內層不可見

5.2 對象的生存期

對象從誕生到結束的這段時間就是它的生存期。

5.2.1 靜態生存期

如果對象的生存期與程序的運行期相同,則稱它具有靜態生存期。

方法:在命名空間作用域聲明或在函數內部的局部作用域中聲明時加上static關鍵字。

局部作用域中的靜態變量特點:不會隨著每次函數調用而產生一個副本,也不會隨著函數返回而失效,當下一次函數調用時,該變量保持上一回的值

5.2.2 動態生存期

在局部作用域中具有動態生存期的對象,習慣上稱為局部生存期對象。局部生存期對象誕生于聲明點,結束于聲明所在的塊執行完畢時。

#include<iostream> using namespace std; int i = 1; // i 為全局變量,具有靜態生存期。 void other() {static int a = 2;static int b;// a,b為靜態局部變量,具有全局壽命,局部可見。//只第一次進入函數時被初始化。int c = 10; // C為局部變量,具有動態生存期,//每次進入函數時都初始化。a += 2; i += 32; c += 5;cout<<"---OTHER---\n";cout<<" i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;b = a; } int main() {static int a;//靜態局部變量,有全局壽命,局部可見,未指定初值,被賦予0值初始化。int b = -10; // b, c為局部變量,具有動態生存期。int c = 0;cout << "---MAIN---\n";cout<<" i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;c += 8; other();cout<<"---MAIN---\n";cout<<" i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;i += 10; other(); return 0; } 運行結果: ---MAIN---i: 1 a: 0 b: -10 c: 0 ---OTHER---i: 33 a: 4 b: 0 c: 15 ---MAIN---i: 33 a: 0 b: -10 c: 8 ---OTHER---i: 75 a: 6 b: 4 c: 15

5.3 類的靜態成員

靜態成員可以解決同一個類的不同對象之間數據和函數共享問題。

5.3.1 靜態數據成員

用關鍵字static聲明

為該類的所有對象共享,靜態數據成員具有靜態生存期。

必須在類外定義和初始化,用(::)來指明所屬的類。

//5_4.cpp #include <iostream> using namespace std;class Point { //Point類定義 public: //外部接口Point(int x = 0, int y = 0) : x(x), y(y) { //構造函數//在構造函數中對count累加,所有對象共同維護同一個countcount++;}Point(Point &p) { //復制構造函數x = p.x;y = p.y;count++;}~Point() { count--; }int getX() { return x; }int getY() { return y; }void showCount() { //輸出靜態數據成員cout << " Object count = " << count << endl;} private: //私有數據成員int x, y;static int count; //靜態數據成員聲明,用于記錄點的個數 };//重要點 int Point::count = 0;//靜態數據成員定義和初始化,使用類名限定int main() { //主函數Point a(4, 5); //定義對象a,其構造函數回使count增1cout << "Point A: " << a.getX() << ", " << a.getY();a.showCount(); //輸出對象個數//可換成Point::showCount();Point b(a); //定義對象b,其構造函數回使count增1cout << "Point B: " << b.getX() << ", " << b.getY();b.showCount(); //輸出對象個數return 0; }運行結果:Point A: 4, 5 Object count=1Point B: 4, 5 Object count=2

5.3.2 靜態函數成員

靜態成員函數可以直接訪問該類的靜態數據和函數成員,而訪問非靜態成員,必須通過對象名。

#include <iostream> using namespace std;class Point { //Point類定義 public: //外部接口Point(int x = 0, int y = 0) : x(x), y(y) { //構造函數//在構造函數中對count累加,所有對象共同維護同一個countcount++;} Point(Point &p) { //復制構造函數x = p.x;y = p.y;count++;}~Point() { count--; }int getX() { return x; }int getY() { return y; }static void showCount(Point &p) { //靜態函數成員cout << " Object count = " << count << endl;cout << "x = " << p.x << endl;}private: //私有數據成員int x, y;static int count; //靜態數據成員聲明,用于記錄點的個數};int Point::count = 0;//靜態數據成員定義和初始化,使用類名限定int main() { //主函數Point a(4, 5); //定義對象a,其構造函數回使count增1cout << "Point A: " << a.getX() << ", " << a.getY();Point::showCount(a); //輸出對象個數和a的xPoint b(a); //定義對象b,其構造函數回使count增1cout << "Point B: " << b.getX() << ", " << b.getY();Point::showCount(a); //輸出對象個數和a的xreturn 0;}

如果把static void showCount(Point &p)改為static void showCount(Point p),則在生成臨時對象的時候count+1

5.4 類的友元

友元破壞了數據隱蔽和封裝,但是提高了程序的效率和可讀性。

5.4.1 友元函數

友元函數是在類聲明中由關鍵字friend修飾說明的非成員函數,在它的函數體中能夠通過對象名訪問 private 和 protected成員。

訪問對象中的成員必須通過對象名。

friend float dist(Point &a, Point &b); 在main中使用: dist(myp1,myp2);

5.4.2 友元類

若一個類為另一個類的友元,則此類的所有成員都能訪問對方類的私有成員。

class A {friend class B;//設置友元類 public:void display() {cout << x << endl;} private:int x; } class B { public:void set(int i);void display(); private:A a;}; void B::set(int i) {a.x=i;//在B的成員函數中可以訪問a類對象的私有成員 } void B::display() {a.display(); }

注意:友元關系不可傳遞;友元關系是單向的;友元關系不可被繼承。

5.5 共享數據的保護

對于既需要共享、又需要防止改變的數據應該聲明為常類型(用const進行修飾)。對于不改變對象狀態的成員函數應該聲明為常函數。

5.5.1 常對象

常對象必須初始化,而且不能被更新。

class A {public:A(int i,int j) {x=i; y=j;}...private:int x,y; }; A const a(3,4); //a是常對象,不能被更新(存放在全局變量棧中,不是局部函數棧)

5.5.2 用const修飾的類成員

1.常成員函數

常成員函數說明格式:類型說明符 函數名(參數表)const;

常成員函數不更新對象的數據成員。

這里,const是函數類型的一個組成部分,因此在實現部分也要帶const關鍵字。

const關鍵字可以被用于參與對重載函數的區分:如果僅以const關鍵字為區分對成員函數重載,那么通過非const的對象

通過常對象只能調用它的常成員函數。

#include <iostream> #include <cmath> using namespace std; class Point { public:Point(int xx, int yy) { x = xx, y = yy; }int getX()const;//必須聲明常成員函數,否則常對象無法訪問 int getY()const;//同上 double Dis(Point p);double Dis(const Point p) const; private:int x;int y; }; inline int Point::getX()const {return x; } inline int Point::getY()const {return y; } double Point::Dis(Point p) {int xx = x - p.getX();int yy = y - p.getY();return sqrt(xx*xx + yy*yy); } double Point::Dis(const Point p)const {int xx = x - p.getX();int yy = y - p.getY();return sqrt(xx*xx + yy*yy); } int main() {const Point myp1(1, 1);const Point myp2(4, 5);cout << "常對象(1,1) and (4,5) Dis: " << myp1.Dis(myp2) << endl;cout << "下面開始構造一般對象" << endl;int x1, y1, x2, y2;cout << "x1 and y1:";cin >> x1 >> y1;cout << "x2 and y2:";cin >> x2 >> y2;Point p1(x1, y1),p2(x2, y2);cout << "一般對象 Dis: " << p1.Dis(p2) << endl;system("pause"); }

2.常數據成員

使用const說明的數據成員。

3.常飲用

聲明形式:const 類型說明符 &引用名;

friend float dist(const Point &p1, const Point &p2);‘ //在main中使用: const Point myp1(1, 1), myp2(4, 5); dist(myp1, myp2);

5.6 多文件結構和編譯預處理命令

5.6.1 C++的一般組織結構

在規模較大的項目中,往往需要多個源程序文件,每個類都有單獨的定義和實現文件,采用將類的定義寫入頭文件中,要使用該類的.cpp文件包含該頭文件的方法,可以對不同的文件進行單獨編寫、編譯,最后再連接,同時充分利用類的封裝特性,在調試過程中只修改一個類的定義和實現,而其余部分不改動。

//文件1,類的定義,Point.h class Point { //類的定義 public: //外部接口Point(int x = 0, int y = 0) : x(x), y(y) { }Point(const Point &p);~Point() { count--; }int getX() const { return x; }int getY() const { return y; }static void showCount(); //靜態函數成員 private: //私有數據成員int x, y;static int count; //靜態數據成員 }; //文件2,類的實現,Point.cpp #include "Point.h" #include <iostream> using namespace std;int Point::count = 0; //使用類名初始化靜態數據成員Point::Point(const Point &p) : x(p.x), y(p.y) { //復制構造函數體count++; }void Point::showCount() {cout << " Object count = " << count << endl; } //文件3,主函數,5_10.cpp #include "Point.h" #include <iostream> using namespace std;int main() {Point a(4, 5); //定義對象a,其構造函數回使count增1cout << "Point A: " << a.getX() << ", " << a.getY();Point::showCount(); //輸出對象個數Point b(a); //定義對象b,其構造函數回使count增1cout << "Point B: " << b.getX() << ", " << b.getY();Point::showCount(); //輸出對象個數return 0; }
5.6.2 外部變量和外部函數
//源文件1 int i = 3; //定義變量i void next();//函數原型聲明int main(){i++;next();return 0; } void next(){i++;other(); }//源文件2 extern int i;//聲明一個在其他文件中定義的變量i void other(){i++; }
5.6.3標準C++庫

如果不加入語句“using namespace std;”就需要在每個標識符前加上“std::”

第六章 數組、指針與字符串

6.1 數組

6.1.1數組的聲明

類型說明符 數組名[ 常量表達式 ] [ 常量表達式 ]…… ;

6.1.2 數組的存儲和初始化

數組元素在內存中是順序,連續存儲的。

二維數組的初始化
將所有數據寫在一個{}內,按順序賦值
例如:static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
分行給二維數組賦初值
例如:static int a[3][4]
={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
可以對部分元素賦初值
例如:static int a[3][4]={{1},{0,6},{0,0,11}};
列出全部初始值時,第1維下標個數可以省略
例如:static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
或:static int a[][4]
={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

6.1.3 數組作為函數參數

使用數組名傳遞數據時,傳遞的是地址。

#include <iostream> using namespace std; void rowSum(int a[][4], int nRow) {for (int i = 0; i < nRow; i++) {for(int j = 1; j < 4; j++)a[i][0] += a[i][j];} } int main() { //主函數int table[3][4] = {{1, 2, 3, 4},{2, 3, 4, 5}, {3, 4, 5, 6}};//聲明并初始化數組//輸出數組元素for (int i = 0; i < 3; i++) {for (int j = 0; j < 4; j++)cout << table[i][j] << " ";cout << endl;}rowSum(table, 3); //調用子函數,計算各行和//輸出計算結果for (int i = 0; i < 3; i++) cout << "Sum of row " << i << " is " << table[i][0] << endl;return 0; }

6.1.4 對象數組

聲明:
類名 數組名[元素個數];
訪問方法:
通過下標訪問
數組名[下標].成員名

數組中每一個元素對象被創建時,系統都會調用類構造函數初始化該對象。

//Point.h #ifndef _POINT_H #define _POINT_Hclass Point { //類的定義 public: //外部接口Point();Point(int x, int y);~Point();void move(int newX,int newY);int getX() const { return x; }int getY() const { return y; }static void showCount(); //靜態函數成員 private: //私有數據成員int x, y; }; #endif //_POINT_H//Point.cpp #include <iostream> #include "Point.h" using namespace std; Point::Point() {x = y = 0;cout << "Default Constructor called." << endl; } Point::Point(int x, int y) : x(x), y(y) {cout << "Constructor called." << endl; } Point::~Point() {cout << "Destructor called." << endl; } void Point::move(int newX,int newY) {cout << "Moving the point to (" << newX << ", " << newY << ")" << endl;x = newX;y = newY; } //6-3.cpp #include "Point.h" #include <iostream> using namespace std;int main() {cout << "Entering main..." << endl;Point a[2];for(int i = 0; i < 2; i++)a[i].move(i + 10, i + 20);cout << "Exiting main..." << endl;return 0; }運行結果:Entering main... Default Constructor called.//調用無參構造函數 Default Constructor called.//調用無參構造函數 Moving the point to (10, 20)//調用成員函數move,i=0 Moving the point to (11, 21)//調用成員函數move,i=1 Exiting main... Destructor called.//return 0調用析構函數 Destructor called.//return 0調用析構函數

6.2 指針

6.2.1 內存空間的訪問方式

通過變量名或地址訪問。

6.2.2 指針變量的聲明

指針變量是用于存放內存單元地址的。

指針變量的初始化:

存儲類型 數據類型 *指針名=初始地址;

6.2.3 與地址相關的運算“*”和“&”

*在聲明語句中表示聲明的是指針類型,而在執行語句中表示訪問指針對象的內容;

&在聲明語句中表示的是聲明的是引用類型,而在執行語句中出現在=號后面表示取對象的地址。

6.2.4 指針的賦值

形式:指針名=地址

指針的類型是它所指向變量的類型,而不是指針本身數據值的類型,任何一個指針本身的數據值都是unsigned long int型。

指向常量的指針
int a; const int *p1 = &a; //p1是指向常量的指針 int b; p1 = &b; //正確,p1本身的值可以改變 *p1 = 1; //編譯時出錯,不能通過p1改變所指的對象
指針類型的常量
int a; int * const p2 = &a; p2 = &b; //錯誤,p2是指針常量,值不能改變

6.2.5 指針的運算

p1[n1]等價于*(p1 + n1)。

y=*px++ 相當于 y=*(px++) (*和++優先級相同,自右向左運算)
關系運算

指向相同類型數據的指針之間可以進行關系運算;

指針和0之間可以進行關系運算:p==0或p!=0。

賦值運算

向指針變量賦的值必須是地址常量或變量,不能是普通整數。但可以賦值為整數0,表示空指針,也就是不指向任何有效地址的指針。

6.2.6 用指針處理數組元素

聲明與賦值

int a[10], *pa; pa=&a[0]; 或 pa=a; 經過上述聲明及賦值后: *pa就是a[0],*(pa+1)就是a[1],... ,*(pa+i)就是a[i]. a[i], *(pa+i), *(a+i), pa[i]都是等效的。 不能寫 a++,因為a是數組首地址是常量。

6.2.7 指針數組

聲明形式:數據類型*數組名[下標表達式];

通過數組元素的地址可以輸出二維數組元素,形式如下:

*(*(array+i)+j)

6.2.8 用指針作為函數參數

如果需要傳遞的數據存放在一個連續的區域里,使用指針作為函數參數只傳遞數據的起始地址,不用傳遞數據的值,可以減少開銷。

函數設置: void splitFloat(float x, int *intPart, float *fracPart) 主函數使用: splitFloat(x, &n, &f); //變量地址作為實參

如果函數體中不需要通過指針改變指針所指對象的內容,應在參數表中將其聲明為指向常量的指針,這樣是的常對象被取地址后也可以作為該函數的參數。

void print(const int *p, int n);

6.2.9 指針型函數

int* max(int a, int b);

6.2.10 指向函數的指針

聲明形式:數據類型 (*函數指針名)(參數表);

#include <iostream> using namespace std; void printStuff(float) {cout << "This is the print stuff function."<< endl; }void printMessage(float data) {cout << "The data to be listed is "<< data << endl; }void printFloat(float data) {cout << "The data to be printed is "<< data << endl; } const float PI = 3.14159f; const float TWO_PI = PI * 2.0f; int main() { //主函數void (*functionPointer)(float); //函數指針printStuff(PI);functionPointer = printStuff; *functionPointer(PI); //函數指針調用functionPointer = printMessage;functionPointer(TWO_PI); //函數指針調用functionPointer(13.0); //函數指針調用functionPointer = printFloat;functionPointer(PI); //函數指針調用printFloat(PI);return 0; }

6.2.11 對象指針

1.一般對象指針的概念

聲明形式
類名 *對象指針名;

訪問方法

對象指針名->成員名;

#include <iostream> using namespace std; class Point { //類的定義 public: //外部接口Point(int x = 0, int y = 0) : x(x), y(y) { } //構造函數int getX() const { return x; } //返回xint getY() const { return y; } //返回y private: //私有數據int x, y; }; int main() { //主函數Point a(4, 5); //定義并初始化對象aPoint *p1 = &a; //定義對象指針,用a的地址將其初始化cout << p1->getX() << endl; //利用指針訪問對象成員cout << a.getX() << endl; //利用對象名訪問對象成員return 0; }
2.this指針

this指針式隱含于每一個類的非靜態成員函數中的特殊指針(包括構造函數和析構函數),它用于指向正在被成員函數操作的對象。

return x;相當于:return this->x;

3.指向類的非靜態成員的指針

聲明一般形式

類型說明符 類名::*指針名; //聲明指向數據成員的指針 類型說明符 (類名::*指針名)(參數表) //聲明指向函數成員的指針

賦值一般形式

指針名=&類名::數據成員名; //數據成員指針賦值 指針名=&類名::函數成員名; //函數成員指針賦值

訪問類對象成員一般形式

/*訪問對象數據成員*/ 對象名.*類成員指針名; 或 對象指針名->*類成員指針名/*訪問對象函數成員*/ (對象名.*類成員指針名)(參數表) 或 (對象指針名->*類成員指針名)(參數表) #include <iostream> using namespace std;class Point{ public:Point(int x = 0, int y = 0):x(x), y(y){}int getX() const {return x;}int getY() const {return y;} private:int x, y; }; int main() {Point a(4, 5);Point *p1 = &a;int (Point::*funcPtr)() const = &Point::getX;cout << (a.*funcPtr)() << endl;cout << (p1->*funcPtr)() << endl;cout << a.getX() << endl;cout << p1->getX() << endl;return 0; }

簡而言之,就是創建一個指針代理類中的一個成員函數。

4.指向類的靜態成員的指針

class Point{public:...static void showCount(){...}static int count; }; int Point::count=0; int main(){int *ptr=&Point::count;void (*funcPtr)()=Point::showCount;... }

6.3 動態內存分配

6.3.1動態申請內存操作符new和釋放內存操作符delete
#include<iostream> using namespace std; class Point {...}; int main() {cout << "Step one: " << endl;Point *ptr1 = new Point;//調用缺省構造函數delete ptr1; //刪除對象,自動調用析構函數cout << "Step two: " << endl;ptr1 = new Point(1,2); delete ptr1; return 0; }
6.3.2申請和釋放動態數組

分配:new 類型名T [ 數組長度 ]
(數組長度可以是任何表達式,在運行時計算)
釋放:delete[] 數組名p
(釋放指針p所指向的數組。p必須是用new分配得到的數組首地址。)

#include<iostream> using namespace std; class Point {...}; int main() {Point *ptr = new Point[2]; //創建對象數組ptr[0].move(5, 10); //通過指針訪問數組元素的成員ptr[1].move(15, 20); //通過指針訪問數組元素的成員cout << "Deleting..." << endl;delete[] ptr; //刪除整個對象數組return 0; }運行結果:Default Constructor called. Default Constructor called. Deleting... Destructor called. Destructor called.
拓展

用new動態創建一維數組時,在“[]”后還可以加“()”,但"()"內不可以帶任何參數。

Point *ptr = new Point[2]; //創建對象數組,數組每個元素的初始化都是執行new Point cout << ptr[0].getX() << endl; Point *ptr = new Point[2]();//創建對象數組,數組的初始化都是執行new Point() cout << ptr[0].getX() << endl;

①若Point的構造函數設置了默認值,則兩個輸出結果相同。

Point():x(0),y(0){}

②若Point的構造函數沒有設置默認值,則兩個輸出結果都是未定義的數。

Point(){}

所以只要定義了構造函數,無論new的時候后面加不加“()”,都會調用自身已有的構造函數。

③若類中不定義構造函數,而使用編譯器的缺省構造函數,則前者輸出未定義的數,后者輸出0。

④如果是調用內置類型,則和③結果相同

int *a = new int; cout << a <<endl;//結果為未定義的數 int *b = new int(); cout << b <<endl;//結果為0
6.3.3 動態創建多維數組
char (*fp)[3]; fp = new char[2][3];
6.3.4動態數組類

需知:assert函數(斷言)當判斷括號內條件表達式值不為true時,程序中止,assert只在調試模式(debug模式)下生效,在發行模式(release模式)不執行任何操作。

#include <iostream> #include <cassert> using namespace std; class Point {...}; class ArrayOfPoints { //動態數組類 public:ArrayOfPoints(int size) : size(size) {points = new Point[size];}~ArrayOfPoints() {cout << "Deleting..." << endl;delete[] points; }Point& element(int index) {//返回“引用”可以用來操作封裝數組對象內部的數組元素。//如果返回“值”則只是返回了一個“副本”,通過“副本”是無法操作原來數組中的元素的assert(index >= 0 && index < size); return points[index];} private:Point *points; //指向動態數組首地址int size; //數組大小 }; int main() {int count;cout << "Please enter the count of points: ";cin >> count;ArrayOfPoints points(count); //創建對象數組//通過訪問數組元素的成員points.element(0).move(5, 0);//通過類訪問數組元素的成員points.element(1).move(15, 20); return 0; }

6.4 用vector創建數組對象

vector是C++標準庫提供的被封裝的動態數組,而且可以具有各種類型。

vector是一個類模板,不是一個類。

使用vector可以很好的檢測下標越界的錯誤。

使用vector定義動態數組的形式

vector <元素類型> 數組對象名(數組長度); 例: vector<int> arr(5)//建立大小為5的int數組

細節:使用vector定義的數組對象的所有元素都會被初始化,如果元素類型是基本數據類型,則初始化的值都是0;如果元素類型是類類型,則會調用類的默認構造函數進行初始化,因此,使用vector定義類動態數組前,需要保證類具有默認構造函數。

只能設置所有元素為相同初值,形式如下

vector <元素類型> 數組對象名(數組長度,元素初值);

使用vector定義的數組對象名和普通的數組對象名不同的是,使用vector定義的數組對象名表示的是數組對象而不是數組的首地址,因為數組對象不是數組,而是封裝了數組的對象。

#include <iostream> #include <vector> using namespace std;//計算數組arr中元素的平均值 double average(const vector<double> &arr) {double sum = 0;for (unsigned i = 0; i < arr.size(); i++)sum += arr[i];return sum / arr.size(); }//arr.size()返回數組的大小 int main() {unsigned n;cout << "n = ";cin >> n;vector<double> arr(n); //創建數組對象cout << "Please input " << n << " real numbers:" << endl;for (unsigned i = 0; i < n; i++)cin >> arr[i];cout << "Average = " << average(arr) << endl;return 0; }

聲明函數時使用vector定義的數組作為形參形式

void outputVector( const vector <int> & ); void inputVector( vector <int> & );

6.5 深復制和淺復制

深拷貝和淺拷貝最根本的區別在于是否真正獲取一個對象的復制實體,而不是引用。

6.5.1 淺復制

淺復制只是創建另外一個指針指向和“復制”的指針相同已存在的地址,并沒有創建副本。

#include <iostream> #include <cassert> using namespace std; class Point {...}; class ArrayOfPoints {...}; int main() {int count;cout << "Please enter the count of points: ";cin >> count;ArrayOfPoints pointsArray1(count); //創建對象數組pointsArray1.element(0).move(5,10);pointsArray1.element(1).move(15,20);ArrayOfPoints pointsArray2(pointsArray1); //創建副本cout << "Copy of pointsArray1:" << endl;cout << "Point_0 of array2: " << pointsArray2.element(0).getX() << ", "<< pointsArray2.element(0).getY() << endl;cout << "Point_1 of array2: " << pointsArray2.element(1).getX() << ", "<< pointsArray2.element(1).getY() << endl;pointsArray1.element(0).move(25, 30);pointsArray1.element(1).move(35, 40);cout << "After the moving of pointsArray1:" << endl;cout << "Point_0 of array2: " << pointsArray2.element(0).getX() << ", "<< pointsArray2.element(0).getY() << endl;cout << "Point_1 of array2: " << pointsArray2.element(1).getX() << ", "<< pointsArray2.element(1).getY() << endl;return 0; } 運行結果如下: Please enter the number of points:2 Default Constructor called. Default Constructor called. Copy of pointsArray1: Point_0 of array2: 5, 10 Point_1 of array2: 15, 20 After the moving of pointsArray1: Point_0 of array2: 25, 30 Point_1 of array2: 35, 40 Deleting... Destructor called. Destructor called. Deleting...

接下來程序出現異常,也就是運行錯誤。
原因分析:
在程序結束前,需要調用pointsArray1和pointsArray2的析構函數,但是兩個對象共用同一個內存地址,所以該空間被釋放兩次,導致運行錯誤。

6.5.2 深復制

深復制創建一個指針,并且申請了新的內存,讓這個指針指向新的內存地址,將需要復制的對象的每一個屬性都復制了一遍而且兩個對象的相同屬性使用兩個不同的內存地址,也就是說兩個對象之間不存在任何一個公用地址。

#include <iostream> #include <cassert> using namespace std; class Point {...}; class ArrayOfPoints { public:ArrayOfPoints(const ArrayOfPoints& pointsArray);... }; ArrayOfPoints::ArrayOfPoints(const ArrayOfPoints& v) {size = v.size;points = new Point[size];for (int i = 0; i < size; i++)points[i] = v.points[i]; } int main() {//同6.5.1 }

6.6 字符串

6.6.1 用字符數組存儲和處理字符串

//以下三條語句具有等價的作用: char str[8] = { 'p', 'r', 'o', 'g', 'r', 'a', 'm', '\0' }; char str[8] = "program"; char str[] = "program";
用字符數組表示字符串的缺點

① 執行連接、拷貝、比較等操作,都需要顯式調用庫函數,很麻煩。
② 當字符串長度很不確定時,需要用new動態創建字符數組,最后要用delete釋放,很繁瑣。
③ 字符串實際長度大于為它分配的空間時,會產生數組下標越界的錯誤。

6.6.2 string類

string類中封裝了串的屬性并提供了一系列允許訪問這些屬性的函數。

string();//默認構造函數 string(const string& rhs);//復制構造函數 string(const char*s);//用指針s指向的字符串常量初始化string類的對象 string(const string& rhs,unsigned int pos,unsigned int n);//從rhs的pos位置開始取n個字符,用來初始化string類的對象 string(const char* s,unsigned int n);//用指針s所指向的字符串中的前n個字符初始化string類的對象 string(unsigned int n,char c);//將參數c中的字符重復n次,用來初始化string類的對象

常用成員函數介紹

string getline (cin,s);//輸入字符串s string getline (cin,s,",")//輸入字符串s,以,為輸入結束的標志 string append (const char* s);//將s添加在本字符串尾 string assign (const char* s);//賦值,將s所指向的字符串賦值給本對象 int compare (const string &str) const;//比較本串與str串的大小,a<str返回負值,a>str返回正值,相等返回0

細節:嚴格來說,string不是一個獨立的類,而是類模板basic_string的一個特化實例。

6.8 深度搜索

第七章 繼承與派生

7.1 類的繼承與派生

7.1.1 概念

類的繼承,是新的類從已有類那里得到已有的特性——從已有類產生新類的過程就是類的派生。

基類或父類(直接基類、間接基類)——派生類或子類。

7.1.2 派生類的定義

繼承方式規定了如何訪問從基類繼承的成員,如果沒有給出繼承方式關鍵字,則默認為private。

單繼承 class 派生類名:繼承方式 基類名{}; 多繼承 class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,...{};

派生類成員指除了從基類繼承來的所有成員之外,新增加的數據和函數成員。

7.1.3 派生類生成過程

1.吸收基類成員

派生類包含了它的全部基類中除構造函數和析構函數之外的所有成員。

2.改造基類成員

①基類成員的訪問控制問題

主要依靠派生類定義時的繼承方式控制。

②對基類數據或函數成員的覆蓋或隱藏。

隱藏:也稱作同名隱藏,派生類聲明一個和某基類成員同名的新成員(成員函數的話參數表也相同,參數不同屬于重載),之后在派生類或通過派生類的對象,只能訪問到派生類中聲明的同名成員,而不能訪問到基類的同名成員。

3.添加新的成員

繼承與派生機制的核心,保證派生類在功能上有所發展的關鍵。

7.2 訪問控制

1.公有繼承

基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的private成員不可直接訪問

派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員

通過派生類的對象只能訪問基類的public成員。

#include <iostream> using namespace std; class Point { public:void initPoint(float x=0,float y=0){this->x=x;this->y=y;}//設置x,y值void movePoint(float offX,float offY){x+=offX;y+=offY;}//移動點函數float getX(){return x;}float getY(){return y;} private:float x,y; }; class Rectangle:public Point { public:void initRectangle(float x,float y,float w,float h){initPoint(x,y);this->w=w;this->h=h;}float getW(){return w;}float getH(){return h;} private:float w,h; }; int main() {Rectangle rect; //定義Rectangle類的對象rect.initRectangle(2, 3, 20, 10); //設置矩形的數據rect.movePoint(3,2); //移動矩形位置cout << "The data of rect(x,y,w,h): " << endl;cout << rect.getX() <<", " //輸出矩形的特征參數<< rect.getY() << ", "<< rect.getW() << ", "<< rect.getH() << endl;return 0; }

Rectangle類的對象rect可以直接訪問基類的公有成員movePoint(…)、getX()、getY()。

2.私有繼承

基類的public和protected成員都以private身份出現在派生類中,但基類的private成員不可直接訪問

派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員

通過派生類的對象不能直接訪問基類中的任何成員

#include <iostream> using namespace std; class Point { public:void initPoint(float x=0,float y=0){this->x=x;this->y=y;}//設置x,y值void movePoint(float offX,float offY){x+=offX;y+=offY;}//移動點函數float getX(){return x;}float getY(){return y;} private:float x,y; }; class Rectangle:private Point { public:void initRectangle(float x,float y,float w,float h){initPoint(x,y);this->w=w;this->h=h;}void movePoint(float offX,float offY){Point::movePoint(offX,offY);}//新增共有函數成員調用基類共有成員函數float getX(){return Point::getX();}//新增共有函數成員調用基類共有成員函數float getY(){return Point::getY();}//新增共有函數成員調用基類共有成員函數float getW(){return w;}float getH(){return h;} private:float w,h; }; int main() {Rectangle rect; //定義Rectangle類的對象rect.initRectangle(2, 3, 20, 10); //設置矩形的數據rect.movePoint(3,2); //移動矩形位置cout << "The data of rect(x,y,w,h): " << endl;cout << rect.getX() <<", " //輸出矩形的特征參數<< rect.getY() << ", "<< rect.getW() << ", "<< rect.getH() << endl;return 0; }

Rectangle類的對象rect不可以直接訪問基類的公有成員movePoint(…)、getX()、getY(),如果使用公有繼承中的例子,就會出現錯誤:error: ‘Point’ is not an accessible base of ‘Rectangle’|,所以需要在派生類Rectangle中新增成員函數來調用基類公有成員函數。

3.保護繼承

基類的public和protected成員都以protected身份出現在派生類中,但基類的private成員不可直接訪問

派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員

通過派生類的對象不能直接訪問基類中的任何成員。

#include <iostream> using namespace std; class Point { public:void initPoint(float x=0,float y=0){this->x=x;this->y=y;}//設置x,y值void movePoint(float offX,float offY){x+=offX;y+=offY;}//移動點函數float getX(){return x;}float getY(){return y;} protected:float z; private:float x,y; }; class Rectangle:protected Point { public:void initRectangle(float x,float y,float w,float h){initPoint(x,y);this->w=w;this->h=h;z=20.1;}void movePoint(float offX,float offY){Point::movePoint(offX,offY);}//移動點函數float getX(){return Point::getX();}float getY(){return Point::getY();}float getZ(){return z;}//直接派生類可以直接訪問基類保護成員float getW(){return w;}float getH(){return h;} private:float w,h; }; int main() {Point p;p.z=2;//編譯錯誤,error: 'float Point::z' is protected within this context|Rectangle rect; //定義Rectangle類的對象rect.initRectangle(2, 3, 20, 10); //設置矩形的數據rect.movePoint(3,2); //移動矩形位置cout << "The data of rect(x,y,w,h): " << endl;cout << rect.getX() <<", " //輸出矩形的特征參數<< rect.getY() << ", "<< rect.getW() << ", "<< rect.getH() << endl;cout << "z="<<rect.getZ() << endl;return 0; }

4.私有繼承和保護繼承區別

對派生類來說,在直接派生類中所有成員訪問屬性和私有繼承是一樣的。

假設a類的派生類b類有了派生類c類:

當b類私有繼承a類,c類的成員和對象都不能訪問間接從a類繼承的成員;

當b類保護繼承a類,那么a類的public和protected成員在b類中都是protected成員,c類有可能訪問間接從a類繼承來的成員

#include <iostream> using namespace std; class Point { public:void initPoint(float x=0,float y=0){this->x=x;this->y=y;}//設置x,y值void movePoint(float offX,float offY){x+=offX;y+=offY;}//移動點函數float getX(){return x;}float getY(){return y;} protected:float z; private:float x,y; }; class Rectangle:protected Point { public:void initRectangle(float x,float y,float w,float h){initPoint(x,y);this->w=w;this->h=h;z=20.1;}void movePoint(float offX,float offY){Point::movePoint(offX,offY);}//移動點函數float getX(){return Point::getX();}float getY(){return Point::getY();}float getW(){return w;}float getH(){return h;} private:float w,h; }; class Square:protected Rectangle { public:void initSquare(float x,float y,float w,float h){initRectangle(x,y,w,h);Rectangle::z=30.1;}void movePoint(float offX,float offY){Rectangle::movePoint(offX,offY);}//移動點函數float getX(){return Point::getX();}//可以訪問間接基類Point的非私有成員函數float getY(){return Point::getY();}//可以訪問間接基類Point的非私有成員函數float getZ(){return z;}//可以訪問間接基類Point的非私有數據成員float getW(){return Rectangle::getW();}//可以訪問直接基類Rectangle的非私有成員函數float getH(){return Rectangle::getH();}}; int main() {Square sq; //定義Square類的對象sq.initSquare(2, 3, 20, 10); //設置矩形的數據sq.movePoint(3,2); //移動矩形位置cout << "The data of rect(x,y,w,h): " << endl;cout << sq.getX() <<", " //輸出矩形的特征參數<< sq.getY() << ", "<< sq.getW() << ", "<< sq.getH() << endl;cout << "z="<<sq.getZ() << endl;return 0; } 運行結果: The data of rect(x,y,w,h): 2,3,20,10 z=30.1

7.3 類型兼容規則

類型兼容規則是指在需要基類對象的任何地方,都可以使用公有派生類的對象來替代,分為以下情況:

①派生類的對象可以隱含轉換為基類對象。

②派生類的對象可以初始化基類的引用。

③派生類的指針可以隱含轉換為基類的指針。

在替代之后,派生類對象可以作為基類的對象使用,只能使用從基類繼承而來的成員。

#include <iostream> using namespace std; class Base1 { //基類Base1定義 public:void display() const {cout << "Base1::display()" << endl;}}; class Base2: public Base1 { //公有派生類Base2定義 public:void display() const {cout << "Base2::display()" << endl;}}; class Derived: public Base2 { //公有派生類Derived定義 public:void display() const {cout << "Derived::display()" << endl;} }; void fun(Base1 *ptr) { //參數為指向基類對象的指針ptr->display(); //"對象指針->成員名"} int main() { //主函數Base1 base1; //聲明Base1類對象Base2 base2; //聲明Base2類對象Derived derived; //聲明Derived類對象fun(&base1); //用Base1對象的指針調用fun函數fun(&base2); //用Base2對象的指針調用fun函數,在fun函數中轉換為Base1類的指針,所以只能使用從Base1類繼承的display()fun(&derived); //用Derived對象的指針調用fun函數,在fun函數中轉換為Base1類的指針,所以只能使用從Base1類繼承的display()return 0; } 運行結果: Base1::display() Base1::display() Base1::display()

7.4 派生類的構造、析構函數

7.4.1 構造函數

在繼承時不會繼承基類的構造函數,所以就需要在構造派生類的對象時,人為地調用基類的構造函數對于基類的成員對象和新增成員對象初始化。

派生類的構造函數一般語法形式:

派生類名::派生類名(參數表): 基類名1(基類1初始參數表),...,基類名n(基類n初始參數表), 成員對象名1(成員對象1初始化參數表),...,成員對象名n(成員對象n初始化參數表){...}

先調用基類的構造函數,然后調用內嵌對象的構造函數,基類構造函數的調用是按照派生類定義的順序,調用順序按照它們被繼承時聲明的順序(從左向右),內嵌對象構造函數調用按照在類中聲明的先后順序。

#include <iostream> using namespace std; class Base1 { //基類Base1,構造函數有參數 public:Base1(int i) { cout << "Constructing Base1 " << i << endl; }}; class Base2 { //基類Base2,構造函數有參數 public:Base2(int j) { cout << "Constructing Base2 " << j << endl; }}; class Base3 { //基類Base3,構造函數無參數 public:Base3() { cout << "Constructing Base3 *" << endl; }}; class Derived: public Base2, public Base1, public Base3 { //派生新類Derived,注意基類名的順序 public: //派生類的公有成員Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b){ }//注意基類名的個數與順序,//注意成員對象名的個數與順序 private: //派生類的私有成員對象Base1 member1;Base2 member2;Base3 member3; }; int main() {Derived obj(1, 2, 3, 4);return 0; } 運行結果: constructing Base2 2//Base2(b) constructing Base1 1//Base1(a) constructing Base3 *//Base3() constructing Base1 3//Base1 member1 constructing Base2 4//Base2 member2 constructing Base3 *//Base3 member3

7.4.2 復制構造函數

派生類的復制構造函數會自動調用基類的復制構造函數,聲明形式:

Derived::Derived(const Derived &v):Base(v){...}

7.4.3 析構函數

析構函數的執行順序和構造函數完全相反,先執行析構函數的函數體,然后對派生類新增的類類型的成員對象進行清理,最后對所有從基類繼承來的成員進行清理。

#include <iostream> using namespace std; class Base1 { //基類Base1,構造函數有參數 public:Base1(int i) {this->i=i; cout << "Constructing Base1 " << i << endl; }~Base1() { cout << "Destructing Base1 " << i <<endl; } private:int i; }; class Base2 { //基類Base2,構造函數有參數 public:Base2(int j) {this->j=j; cout << "Constructing Base2 " << j << endl; }~Base2() { cout << "Destructing Base2 " << j <<endl; } private:int j; }; class Base3 { //基類Base3,構造函數無參數 public:Base3() { cout << "Constructing Base3 *" << endl; }~Base3() { cout << "Destructing Base3-*-*-*-" << endl; } }; class Derived: public Base2, public Base1, public Base3 { //派生新類Derived,注意基類名的順序 public: //派生類的公有成員Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b) { }//注意基類名的個數與順序,注意成員對象名的個數與順序~Derived(){cout << "Destructing Derived" << endl;} private: //派生類的私有成員對象Base1 member1;Base2 member2;Base3 member3; }; int main() {Derived obj(1, 2, 3, 4);return 0; }運行結果: constructing Base2 2 //Base2(b) constructing Base1 1 //Base1(a) constructing Base3 * //Base3() constructing Base1 3 //Base1 member1(c) constructing Base2 4 //Base2 member2(d) constructing Base3 * //Base3 member3 Destructing Derived //執行派生類析構函數的函數體 Destructing Base3-*-*-*- //清理派生類新增的類類型的成員對象member3.~Base3() Destructing Base2 4 //清理派生類新增的類類型的成員對象member2.~Base2() Destructing Base1 3 //清理派生類新增的類類型的成員對象member1.~Base1() Destructing Base3-*-*-*- //清理從基類繼承來的成員Base3.~Base3() Destructing Base1 1 //清理從基類繼承來的成員Base1(1).~Base1() Destructing Base2 2 //清理從基類繼承來的成員Base2(2).~Base2()

7.5 派生類成員的標識與訪問

7.5.1 作用域分辨符(::)

如果派生類中聲明了與基類成員函數同名的新函數,即使函數的參數表不同,從基類繼承的同名函數的所有重載形式也都會被隱藏,如果要訪問被隱藏的成員,就需要使用作用域分辨符和基類名來限定。

在多繼承中,如果派生類沒有聲明同名成員,且各基類中存在相同名稱的成員,則派生類對象名.成員名或派生類對象指針->成員名,會產生二義性

細節:派生類中定義了基類同名成員,但是參數表不同的話,不屬于函數重載,但是調用該基類成員也需要基類名::成員名。

#include <iostream> using namespace std; class Base1 { //定義基類Base1 public:int var;void fun() { cout << "Member of Base1" << endl; } }; class Base2 { //定義基類Base2 public:int var;void fun() { cout << "Member of Base2" << endl; } }; class Derived: public Base1, public Base2 { //定義派生類Derived public:int var; //同名數據成員 }; int main() {Derived d;Derived *p = &d;d.var = 1; //對象名.成員名標識//d.fun(); //編譯錯誤,d.Base1::var = 2; //作用域操作符標識d.Base1::fun(); //訪問Base1基類成員p->Base2::var = 3; //作用域操作符標識p->Base2::fun(); //訪問Base2基類成員return 0; }運行結果: Member of Base1 Member of Base2

在Derived類中新增兩個成員函數,一個解決二義性,一個與基類同名但參數表不同,如下

#include <iostream> using namespace std; class Base1 { //定義基類Base1 public:int var;void fun() { cout << "Member of Base1" << endl; } }; class Base2 { //定義基類Base2 public:int var;void fun() { cout << "Member of Base2" << endl; } }; class Derived: public Base1, public Base2 { //定義派生類Derived public:int var; //同名數據成員void fun(){Base1::fun();}//或using Base1::fun;void fun(int i){cout << "Member of Derived" << endl;} }; int main() {Derived d;Derived *p = &d;d.var = 1; //對象名.成員名標識d.fun(1); //訪問Derived類成員d.fun(); //通過訪問Derived類成員,訪問Base1基類成員d.Base1::var = 2; //作用域操作符標識d.Base1::fun(); //訪問Base1基類成員p->Base2::var = 3; //作用域操作符標識p->Base2::fun(); //訪問Base2基類成員 return 0; }運行結果: Member of Derived Member of Base1 Member of Base1 Member of Base2

多繼承同名隱藏實例

#include <iostream> using namespace std; class Base0 { //定義基類Base0 public:int var0;void fun0() { cout << "Member of Base0" << endl; }}; class Base1: public Base0 { //定義派生類Base1 public: //新增外部接口int var1;}; class Base2: public Base0 { //定義派生類Base2 public: //新增外部接口int var2;}; class Derived: public Base1, public Base2 {//定義派生類Derived public: //新增外部接口int var;void fun() { cout << "Member of Derived" << endl; }};int main() { //程序主函數Derived d; //定義Derived類對象dd.Base1::var0 = 2; //使用直接基類d.Base1::fun0();d.Base2::var0 = 3; //使用直接基類d.Base2::fun0();return 0; }運行結果: Member of Base0 Member of Base0

上述派生類對象在內存中擁有兩份var0的副本,可以存放不同的值,可以通過Base1和Base2調用Base0的構造函數初始化,或者使用作用域分辨符通過直接基類名限定類分別訪問。

上述派生類對象在內存中始終只有一份fun0的副本,之所以需要通過基類名Base1或Base2加以限定,是因為調用非靜態成員函數總是針對特定的對象,執行函數調用時需要將指向該類的一個對象的指針作為隱含的參數傳遞給被調函數來初始化this指針,上述例子中,因為有兩個Base0類的子對象,所以作用域分辨符用Base1或Base2限定,哪個派生類的Base0子對象被調用。

7.5.2 虛基類

為了解決上面的問題,我們將共同基類設置為虛基類,這時從不同路徑繼承過來的同名數據成員在內存中就只有一個副本,同一個函數名也只有一個映射。

虛基類的聲明式在派生類的定義過程中進行的,語法形式為

class 派生類名:virtual 繼承方式 基類名 #include <iostream> using namespace std; class Base0 { //定義基類Base0 public:int var0;void fun0() { cout << "Member of Base0" << endl; }}; class Base1: virtual public Base0 { //定義派生類Base1 public: //新增外部接口int var1;}; class Base2: virtual public Base0 { //定義派生類Base2 public: //新增外部接口int var2;}; class Derived: public Base1, public Base2 {//定義派生類Derived public: //新增外部接口int var;void fun() { cout << "Member of Derived" << endl; }};int main() { //程序主函數Derived d; //定義Derived類對象dd.var0 = 2; //直接訪問虛基類的數據成員d.fun0(); //直接訪問虛基類的函數成員return 0; }運行結果: Member of Base0

不使用虛基類可以容納更多數據,使用虛基類更簡潔,內存空間更節省。

7.5.3 虛基類及其派生類構造函數

#include <iostream> using namespace std; class Base0 { //定義基類Base0 public:Base0(int var) : var0(var) { }int var0;void fun0() { cout << "Member of Base0" << endl; }}; class Base1: virtual public Base0 {//定義派生類Base1 public: //新增外部接口Base1(int var) : Base0(var) { }int var1;}; class Base2: virtual public Base0 {//定義派生類Base2 public: //新增外部接口Base2(int var) : Base0(var) { }int var2;}; class Derived: public Base1, public Base2 {//定義派生類Derived public: //新增外部接口Derived(int var) : Base0(var), Base1(var), Base2(var) { }int var;void fun() { cout << "Member of Derived" << endl; }}; int main() { //程序主函數Derived d(1); //定義Derived類對象dd.var0 = 2; //直接訪問虛基類的數據成員d.fun0(); //直接訪問虛基類的函數成員return 0; }

單看代碼,建立Derived類對象d時需要調用Base0構造函數并初始化var0、Base1和Base2構造函數Base1()和Base2(),那么豈不是要初始化3次從虛基類繼承來的var0。

對此C++給出了解決方法,將建立對象時所指定的類稱為當時的最遠派生類,當此類對象含有從虛基類繼承來的成員,則只由最遠派生類的構造函數調用虛基類的構造函數進行初始化,而忽略其他類對虛基類構造函數的調用。

拓展

構造一個類的對象的一般順序是:

  • 如果有直接或間接的虛基類,則先執行虛基類的構造函數;
  • 按照繼承順序執行各非虛基類構造函數,但不再執行它們的虛基類的構造函數;
  • 按照類定義的新增成員順序執行類構造函數;
  • 執行構造函數的函數體。
  • 7.8 深度探索

    第八章 多態性

    8.1 多態性概述

    多態是指同樣的消息被不同類型的對象接收時導致不同的行為。

    8.1.1 多態的類型

    面向對象的多態性分為四種類型:

    專用多態:重載多態、強制多態。

    通用多態:包含多態、參數多態。

    根據多態性作用的時機可以分為:編譯時的多態、運行時的多態。

    8.1.2 多態的實現

    綁定是指將一個標識符名和一個存儲地址聯系在一起的過程。

    編譯時的多態——綁定工作在編譯連接階段完成的情況稱為靜態綁定。

    運行時的多態——綁定工作在程序運行階段完成的情況稱為動態綁定

    8.2 運算符重載

    運算符重載是對已有的運算符賦予多重含義,使同一個運算符作用與不同類型的數據時導致不同的行為。

    運算符重載的本質就是函數重載。

    8.2.1 運算符重載的規則

    1.只能重載C++中已經有的運算符

    不能重載的運算符舉例:類屬關系運算符“.”、成員指針運算符“.*”、作用域分辨符“::”、三目運算符“?:”

    2.重載之后運算符的優先級和結合性都不會改變

    3.運算符重載是針對新類型數據的實際需要,對原有運算符進行適當的改造

    兩種重載方式

    重載為類的非靜態成員函數和重載為非成員函數

    聲明形式
    函數類型 operator 運算符(形參) {...... }

    當運算符重載為成員函數的時候,函數的參數個數要比原操作個數少一個(后置“++”,“–”除外),因為第一個操作數會被作為函數調用的目的對象,因此無需出現在參數表中,函數體中可以直接訪問第一個操作數的成員;

    當運算符重載為非成員函數的時候,函數的參數個數和原操作個數相同,且至少應該有一個自定義類型的形參,因為運算符的所有操作數必須顯式通過參數傳遞。

    8.2.2 運算符重載為成員函數

    雙目運算符 B

    如果要重載 B 為類成員函數,使之能夠實現表達式 oprd1 B oprd2,其中 oprd1 為A 類對象,則 B 應被重載為 A 類的成員函數,形參類型應該是 oprd2 所屬的類型。
    經重載后,表達式 oprd1 B oprd2 相當于 oprd1.operator B(oprd2)。

    #include <iostream> using namespace std; class Complex { //復數類定義 public: //外部接口Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { } //構造函數Complex operator + (const Complex &c2) const; //運算符+重載成員函數Complex operator - (const Complex &c2) const; //運算符-重載成員函數void display() const; //輸出復數 private: //私有數據成員double real; //復數實部double imag; //復數虛部 }; Complex Complex::operator + (const Complex &c2) const { //重載運算符函數實現return Complex(real + c2.real, imag + c2.imag); //創建一個臨時無名對象作為返回值 }Complex Complex::operator - (const Complex &c2) const { //重載運算符函數實現return Complex(real - c2.real, imag - c2.imag); //創建一個臨時無名對象作為返回值 } void Complex::display() const {cout << "(" << real << ", " << imag << ")" << endl; } int main() { //主函數Complex c1(5, 4), c2(2, 10), c3; //定義復數類的對象cout << "c1 = "; c1.display();cout << "c2 = "; c2.display();c3 = c1 - c2; //使用重載運算符完成復數減法cout << "c3 = c1 - c2 = "; c3.display();c3 = c1 + c2; //使用重載運算符完成復數加法cout << "c3 = c1 + c2 = "; c3.display();return 0; }程序輸出的結果為: c1 = (5, 4) c2 = (2, 10) c3 = c1 - c2 = (3, -6) c3 = c1 + c2 = (7, 14)
    前置單目運算符U

    如果要重載為類的成員函數,使之能夠實現表達式U oprd,其中oprd為A類的對象,則U應當重載為A類的成員函數,函數沒有形參。

    經重載后,表達式U oprd相當于oprd.operator U()。

    后置單目運算符++、–

    如果要重載為類的成員函數,使之能夠實現表達式oprd++或oprd–,其中oprd為A類的對象,則U應當重載為A類的成員函數,函數要帶有一個整型int形參。

    經重載后,表達式oprd++和oprd–相當于oprd.operator++(0)和oprd.operator–(0)。

    #include <iostream> using namespace std; class Clock { //時鐘類定義 public: //外部接口Clock(int hour = 0, int minute = 0, int second = 0);void showTime() const;Clock& operator ++ (); //前置單目運算符重載Clock operator ++ (int); //后置單目運算符重載 private: //私有數據成員int hour, minute, second; };Clock::Clock(int hour/* = 0 */, int minute/* = 0 */, int second/* = 0 */) { if (0 <= hour && hour < 24 && 0 <= minute && minute < 60&& 0 <= second && second < 60) {this->hour = hour;this->minute = minute;this->second = second;} elsecout << "Time error!" << endl; } void Clock::showTime() const { //顯示時間函數cout << hour << ":" << minute << ":" << second << endl; }Clock & Clock::operator ++ () { //前置單目運算符重載函數second++;if (second >= 60) {second -= 60;minute++;if (minute >= 60) {minute -= 60;hour = (hour + 1) % 24;}}return *this; }Clock Clock::operator ++ (int) { //后置單目運算符重載//注意形參表中的整型參數Clock old = *this;++(*this); //調用前置“++”運算符return old; } int main() {Clock myClock(23, 59, 59);cout << "First time output: ";myClock.showTime();cout << "Show myClock++: ";(myClock++).showTime();cout << "Show ++myClock: ";(++myClock).showTime();return 0; }運行結果: First time output: 23:59:59 Show myClock++: 23:59:59 Show ++myClock: 0:0:1

    前置單目運算符和后置單目運算符最主要的區別就在于重載函數的形參。

    (對于函數參數表中并未使用的參數,C++允許不給出參數名,所有后置單目運算符重載的int形參可以只給出類型名)

    8.2.3 運算符重載為非成員函數

    函數的形參代表依自左至右次序排列的各操作數。

    如果在運算符的重載函數中需要操作某類對象的私有成員或保護成員,可以將此函數聲明為該類的友元,但不要盲目聲明為類的友元函數。

    如果不聲明為友元函數,則該函數僅依賴于類的接口,只要類不變,函數的實現就不需要變;如果聲明為友元函數,該函數就依賴于類的實現,即使類的接口不變,只要類的私有數據成員發生變化,該函數的實現就必須變化。

    雙目運算符 B

    重載后,表達式oprd1 B oprd2 等同于operator B(oprd1,oprd2 )

    //8_3.cpp #include <iostream> using namespace std;class Complex { //復數類定義 public: //外部接口Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { } //構造函數friend Complex operator + (const Complex &c1, const Complex &c2); //運算符+重載friend Complex operator - (const Complex &c1, const Complex &c2); //運算符-重載friend ostream & operator << (ostream &out, const Complex &c); //運算符<<重載 private: //私有數據成員double real;//復數實部double imag;//復數虛部 }; Complex operator + (const Complex &c1, const Complex &c2) { //重載運算符函數實現return Complex(c1.real + c2.real, c1.imag + c2.imag); } Complex operator - (const Complex &c1, const Complex &c2) { //重載運算符函數實現return Complex(c1.real - c2.real, c1.imag - c2.imag); } ostream & operator << (ostream &out, const Complex &c) { //重載運算符函數實現out << "(" << c.real << ", " << c.imag << ")";return out; } int main() { //主函數Complex c1(5, 4), c2(2, 10), c3; //定義復數類的對象cout << "c1 = " << c1 << endl;cout << "c2 = " << c2 << endl;c3 = c1 - c2 - c2; //使用重載運算符完成復數減法cout << "c3 = c1 - c2 - c2 = " << c3 << endl;c3 = 5.0 + c2; //使用重載運算符完成復數加法cout << "c3 = 5.0 + c2 = " << c3 << endl;return 0; }程序輸出的結果為: c1 = (5, 4) c2 = (2, 10) c3 = c1 - c2 - c2 = (1, -16) c3 = 5.0 + c2 = (7, 10)

    “<<”操作符的左操作數是ostream類型的引用,ostream是cout的一個基類,右操作數是Complex類型的引用,在執行cout<<c1時,調用operator<<(cout,c1)。該函數把第一個參數傳入的ostream對象以引用形式返回,是為了支持形如“cout<<c1<<c2”的連續輸出,因為第二個“<<”操作符的左操作數是第一個“<<”操作符的返回結果,所以需要返回引用的形式。

    前置單目運算符 U

    重載后,表達式 U oprd 等同于operator U(oprd )

    后置單目運算符 ++和–

    重載后,表達式 oprd B 等同于operator B(oprd,0 )

    8.3 虛函數

    虛函數是動態綁定的基礎;虛函數必須是非靜態的成員函數;虛函數經過派生之后,在類族中就可以實現運行過程中的多態。

    8.3.1 一般虛函數成員

    聲明形式

    virtual 函數類型 函數名(形參表) {... }

    虛函數聲明只能出現在類定義中的函數原型聲明中,而不能在成員函數實現的時候。

    運行過程中的多態必須滿足條件
  • 類之間滿足賦值兼容規則。

    賦值兼容規則簡單分類:派生類的對象可以賦值給基類對象、派生類的對象可以初始化基類的引用、派生類對象的地址可以賦給指向基類的指針。

  • 聲明虛函數

  • 由成員函數來調用或者是通過指針、引用來訪問虛函數(如果是使用對象名來訪問虛函數,在編譯過程中就可以進行(靜態綁定))

  • 虛函數一般不聲明為內聯函數,因為對虛函數的調用需要動態綁定,而對內聯函數的處理是靜態的,所以一般虛函數不能以內聯函數處理,但如果聲明為內聯函數也不會引起錯誤。

    #include <iostream> using namespace std;class Base1 { //基類Base1定義 public:virtual void display() const; //虛函數 }; void Base1::display() const {cout << "Base1::display()" << endl; }class Base2:public Base1 { //公有派生類Base2定義 public:/*virtual*/void display() const; //覆蓋基類的虛函數 }; void Base2::display() const {cout << "Base2::display()" << endl; } class Derived: public Base2 { //公有派生類 public:/*virtual*/void display() const; //覆蓋基類的虛函數 }; void Derived::display() const {cout << "Derived::display()" << endl; }void fun(Base1 *ptr) { //參數為指向基類對象的指針ptr->display(); //"對象指針->成員名" }int main() { //主函數Base1 base1; //定義Base1類對象Base2 base2; //定義Base2類對象Derived derived; //定義Derived類對象fun(&base1);//用Base1對象的指針調用fun函數fun(&base2);//用Base2對象的指針調用fun函數fun(&derived);//用Derived對象的指針調用fun函數return 0; }運行結果: Base1::display() Base2::display() Derived::display()

    上述程序滿足運行中的多態必需三個條件:Base1、Base2和Derived屬于同一個類族,通過公有派生而來,滿足賦值兼容規則;Base1中聲明了虛函數;程序中通過對象指針調用成員。

    當派生類沒有顯式聲明虛函數時,系統遵循一下規則判斷:

  • 是否與基類虛函數有相同的名稱
  • 是否與基類虛函數有相同的參數個數和類型
  • 是否與基類虛函數有相同的返回值或滿足賦值兼容規則的指針、引用型
  • 滿足以上三個條件,會自動確定為虛函數,這時派生類虛函數會覆蓋基類虛函數,同時隱藏基類中同名函數的所有重載形式。

    補充:如果fun函數換成以下形式,會有不同結果

    //情況1 void fun(Base1 *ptr) { //參數為指向基類對象的指針ptr->Base1::display(); //"對象指針->基類::成員名"調用被覆蓋的基類成員函數 } //情況2 void fun(Base1 ptr) { //參數為基類對象ptr.display(); //"對象名.成員名"調用成員函數 } int main() {fun(base1);//用Base1對象調用fun函數fun(base2);//用Base2對象調用fun函數fun(derived);//用Derived對象調用fun函數 }運行結果都為: Base1::display() Base1::display() Base1::display()

    補充

    對象切片:用派生類對象復制構造基類對象的行為。例如

    Derived d; Base1 b = d;//調用Base1的復制構造函數用d構造b

    8.3.2 虛析構函數

    C++中不可以聲明虛構造函數,但可以聲明虛析構函數,如果類的析構函數是虛函數,那么它的所有派生類的析構函數也是虛函數。

    簡單來說,如果有可能通過基類指針刪除派生類對象,就需要讓析構函數是虛函數,否則會產生不確定的結果。

    聲明形式

    virtual ~類名();

    不聲明析構函數為虛函數

    #include <iostream> using namespace std;class Base { public:~Base(); }; Base::~Base() {cout<< "Base destructor" << endl;}class Derived: public Base{ public:Derived();~Derived();private:int *p; }; Derived::Derived() {p = new int(0); } Derived::~Derived() { cout << "Derived destructor" << endl;delete p; }void fun(Base* b) {delete b; }int main() {Base *b = new Derived();fun(b);return 0; }運行結果: Base destructor

    此時派生類析構函數不執行,內存泄漏。

    析構函數聲明為虛函數

    #include <iostream> using namespace std;class Base { public:virtual ~Base(); }; Base::~Base() {cout<< "Base destructor" << endl;}class Derived: public Base{ public:Derived();~Derived();private:int *p; }; Derived::Derived() {p = new int(0); } Derived::~Derived() { cout << "Derived destructor" << endl;delete p; }void fun(Base* b) {delete b; }int main() {Base *b = new Derived();fun(b);return 0; }運行結果: Derived destructor Base destructor

    內存空間被正確釋放,實現了多態。

    8.4 純虛函數與抽象類

    抽象類為類族提供統一的操作界面,可以說,建立抽象類就是為了通過它多態地使用其中的成員函數。

    抽象類是帶純虛函數的類,抽象類不能實例化。

    聲明形式

    virtual 函數類型 函數名(參數表) = 0;

    聲明為純虛函數之后,基類中就可以不再給出函數的實現部分,函數體由派生類給出。

    //8_6.cpp #include <iostream> using namespace std;class Base1 { //基類Base1定義 public:virtual void display() const = 0; //純虛函數 };class Base2: public Base1 { //公有派生類Base2定義 public:void display() const; //覆蓋基類的虛函數 }; void Base2::display() const {cout << "Base2::display()" << endl; } class Derived: public Base2 { //公有派生類Derived定義 public:void display() const; //覆蓋基類的虛函數 }; void Derived::display() const {cout << "Derived::display()" << endl; }void fun(Base1 *ptr) { //參數為指向基類對象的指針ptr->display(); //"對象指針->成員名" }int main() { //主函數Base2 base2; //定義Base2類對象Derived derived; //定義Derived類對象fun(&base2); //用Base2對象的指針調用fun函數fun(&derived); //用Derived對象的指針調用fun函數return 0; }運行結果: Base2::display() Derived::display()

    8.7 深度探索

    第九章 群體類和群體數據的組織

    9.1 函數模板與類模板

    參數化多態性:將程序所處理的對象的類型參數化,使得一段程序可以用于處理多種不同類型的對象。

    9.1.1 函數模板

    定義形式

    template<模板參數表>//模板參數表多為typename T或class T 類型名 函數名(參數表) {... }

    例:求絕對值函數的模板

    #include <iostream> using namespace std; template<typename T> T abs(T x) {return x < 0? -x : x; } int main() {int n = -5;double d = -5.5;cout << abs(n) << endl;//abs(n)會讓編譯器生成函數模板的一個實例int abs(int x),并傳入n的值執行此函數cout << abs(d) << endl;//abs(b)會讓編譯器生成函數模板的一個實例double abs(double x),并傳入b的值執行此函數return 0; }

    #include <iostream> using namespace std;template <class T> //定義函數模板 void outputArray(const T *array, int count) {for (int i = 0; i < count; i++)cout << array[i] << " ";cout << endl; }int main() { //主函數const int A_COUNT = 8, B_COUNT = 8, C_COUNT = 20;int a [A_COUNT] = { 1, 2, 3, 4, 5, 6, 7, 8 }; //定義int數組double b[B_COUNT] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 };//定義double數組char c[C_COUNT] = "Welcome to see you!";//定義char數組cout << " a array contains:" << endl;outputArray(a, A_COUNT); //調用函數模板cout << " b array contains:" << endl;outputArray(b, B_COUNT); //調用函數模板cout << " c array contains:" << endl;outputArray(c, C_COUNT); //調用函數模板return 0; }運行結果: a array contains: 1 2 3 4 5 6 7 8 b array contains: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 c array contains: W e l c o m e t o s e e y o u !
    注意
  • 函數模板編譯時不會生成任何目標代碼,只有實例會生成;
  • 被多個源文件引用的模板應該把函數體也放進頭文件,而不能像普通函數那樣只放聲明;
  • 函數指針只能指向實例,不可以指向模板本身。
  • 9.1.2 類模板

    使用類模板使用戶可以為類聲明一種模式,使得類中的某些數據成員、某些成員函數的參數、某些成員函數的返回值,能取任意類型(包括基本類型的和用戶自定義類型)。

    語法形式:

    template<模板參數表> class 類名 {... } //在類模板外定義成員函數: template<模板參數表> 類型名 類名<模板參數標識符列表>::函數名(參數表) //使用模板類建立對象 模板名<模板參數表>對象名1,...,對象名n

    #include <iostream> #include <cstdlib> using namespace std; struct Student {int id; //學號float gpa; //平均分 }; template <class T> class Store {//類模板:實現對任意類型數據進行存取 private:T item; // item用于存放任意類型的數據bool haveValue; // haveValue標記item是否已被存入內容 public:Store(); // 缺省形式(無形參)的構造函數T &getElem(); //提取數據函數void putElem(const T &x); //存入數據函數 };template <class T> //默認構造函數的實現 Store<T>::Store(): haveValue(false) { } template <class T> //提取數據函數的實現 T &Store<T>::getElem() {//如試圖提取未初始化的數據,則終止程序if (!haveValue) { cout << "No item present!" << endl;exit(1); //使程序完全退出,返回到操作系統。}return item; // 返回item中存放的數據 } template <class T> //存入數據函數的實現 void Store<T>::putElem(const T &x) {// 將haveValue 置為true,表示item中已存入數值 haveValue = true; item = x; // 將x值存入item }int main() {Store<int> s1, s2; s1.putElem(3); s2.putElem(-7);cout << s1.getElem() << " " << s2.getElem() << endl;Student g = { 1000, 23 };Store<Student> s3;s3.putElem(g); cout << "The student id is " << s3.getElem().id << endl;Store<double> d;cout << "Retrieving object D... ";cout << d.getElem() << endl //由于d未經初始化,在執行函數D.getElement()過程中導致程序終止return 0; }運行結果: 3 -7 The student id is 1000 Retrieving object D... No item present!

    9.2 線性群體

    9.2.1 線性群體的概念

    群體是指由多個數據元素組成的集合體。群體可以分為兩個大類:線性群體和非線性群體。

    線性群體中的元素次序與其位置關系是對應的。在線性群體中,又可按照訪問元素的不同方法分為直接訪問、順序訪問和索引訪問。

    對可直接訪問的線性群體,我們可以直接訪問群體中的任何一個元素,例如通過數組下標直接訪問數組元素。對順序訪問的線性群體,只能按照元素的排列順序從頭開始訪問各個元素。

    9.2.2 直接訪問群體——數組類

    靜態數組缺點:大小在編譯時就已經確定,在運行時無法修改。

    動態數組優點:其元素個數可在程序運行時改變。

    vector就是用類模板實現的動態數組。

    動態數組類模板 Array,聲明和實現都在Array.h文件中

    #ifndef ARRAY_H #define ARRAY_H #include <cassert>template <class T> //數組類模板定義 class Array { private:T* list; //用于存放動態分配的數組內存首地址int size; //數組大小(元素個數) public:Array(int sz = 50); //構造函數Array(const Array<T> &a); //拷貝構造函數~Array(); //析構函數Array<T> & operator = (const Array<T> &rhs); //重載"=“T & operator [] (int i); //重載"[]”const T & operator [] (int i) const; operator T * (); //重載到T*類型的轉換operator const T * () const;int getSize() const; //取數組的大小void resize(int sz); //修改數組的大小 }; template <class T> Array<T>::Array(int sz) {//構造函數assert(sz >= 0);//sz為數組大小(元素個數),應當非負size = sz; // 將元素個數賦值給變量sizelist = new T [size]; //動態分配size個T類型的元素空間 } template <class T> Array<T>::~Array() { //析構函數delete [] list; } //拷貝構造函數 template <class T> Array<T>::Array(const Array<T> &a) {size = a.size; //從對象x取得數組大小,并賦值給當前對象的成員//為對象申請內存并進行出錯檢查list = new T[size]; // 動態分配n個T類型的元素空間for (int i = 0; i < size; i++) //從對象X復制數組元素到本對象 list[i] = a.list[i]; }//重載"="運算符,將對象rhs賦值給本對象。實現對象之間的整體賦值 template <class T> Array<T> &Array<T>::operator = (const Array<T>& rhs) {if (&rhs != this) { //如果本對象中數組大小與rhs不同,則刪除數組原有內存,然后重新分配if (size != rhs.size) {delete [] list; //刪除數組原有內存size = rhs.size; //設置本對象的數組大小list = new T[size]; //重新分配n個元素的內存}//從對象X復制數組元素到本對象 for (int i = 0; i < size; i++)list[i] = rhs.list[i];}return *this; //返回當前對象的引用 } //重載下標運算符,實現與普通數組一樣通過下標訪問元素,并且具有越界檢查功能 template <class T> T &Array<T>::operator[] (int n) {assert(n >= 0 && n < size); //檢查下標是否越界return list[n]; //返回下標為n的數組元素 } template <class T> const T &Array<T>::operator[] (int n) const {assert(n >= 0 && n < size); //檢查下標是否越界return list[n]; //返回下標為n的數組元素 }? //重載指針轉換運算符,將Array類的對象名轉換為T類型的指針 template <class T> Array<T>::operator T * () {return list; //返回當前對象中私有數組的首地址 }template <class T> Array<T>::operator const T * () const {return list; //返回當前對象中私有數組的首地址 } //取當前數組的大小 template <class T> int Array<T>::getSize() const {return size; } // 將數組大小修改為sz template <class T> void Array<T>::resize(int sz) {assert(sz >= 0); //檢查sz是否非負if (sz == size) //如果指定的大小與原有大小一樣,什么也不做return;T* newList = new T [sz]; //申請新的數組內存int n = (sz < size) ? sz : size;//將sz與size中較小的一個賦值給n//將原有數組中前n個元素復制到新數組中for (int i = 0; i < n; i++)newList[i] = list[i];delete[] list; //刪除原數組list = newList; // 使list指向新數組size = sz; //更新size } #endif //ARRAY_H
    淺復制和深復制

    如果沒有對“=”重載,那么系統自動生成隱含的重載函數,給每個數據成員執行“=”運算符,也就是淺復制。所以當需要通過顯式定義復制構造函數執行深復制的時候,就需要重載賦值運算符。

    與眾不同的運算符

    重載的“=”和“[]”返回值類型都是對象的引用,因為“=”左值不能為一個對象的值,對其賦值沒有意義,而“[]”經常需要作為左值,所以將“[]”返回值類型指定為對象的引用,通過引用可以改變對象的值。

    指針轉換運算符的作用
    #include <iostream> using namespace std;void read(int *p, int n) {for (int i = 0; i < n; i++)cin >> p[i]; } int main() {int a[10];read(a, 10);return 0; }#include "Array.h" #include <iostream> using namespace std;void read(int *p, int n) {for (int i = 0; i < n; i++)cin >> p[i]; } int main() { Array<int> a(10);read(a, 10);return 0; }

    調用read函數的時候系統會嘗試把對象名轉換為int*類型,會編譯錯誤,所以需要定義指針類型轉換函數。

    //重載指針轉換運算符,將Array類的對象名轉換為T類型的指針 template <class T> Array<T>::operator T * () {return list; //返回當前對象中私有數組的首地址 }

    Array類的應用

    求范圍2~N中的質數,N在程序運行時由鍵盤輸入。

    #include <iostream> #include <iomanip> #include "Array.h" using namespace std; int main() {Array<int> a(10); // 用來存放質數的數組,初始狀態有10個元素。int n, count = 0;cout << "Enter a value >= 2 as upper limit for prime numbers: ";cin >> n;for (int i = 2; i <= n; i++) {bool isPrime = true;for (int j = 0; j < count; j++)if (i % a[j] == 0) { //若i被a[j]整除,說明i不是質數isPrime = false; break;}if (isPrime) { //如果質數表填滿了,將其空間加倍if (count == a.getSize()) a.resize(count * 2);a[count++] = i;}}for (int i = 0; i < count; i++) cout << setw(8) << a[i];cout << endl;return 0; }運行結果: Enter a value >= 2 as upper limit for prime numbers:1002 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

    現對象之間的整體賦值
    template
    Array &Array::operator = (const Array& rhs) {
    if (&rhs != this) {
    //如果本對象中數組大小與rhs不同,則刪除數組原有內存,然后重新分配
    if (size != rhs.size) {
    delete [] list; //刪除數組原有內存
    size = rhs.size; //設置本對象的數組大小
    list = new T[size]; //重新分配n個元素的內存
    }
    //從對象X復制數組元素到本對象
    for (int i = 0; i < size; i++)
    list[i] = rhs.list[i];
    }
    return this; //返回當前對象的引用
    }
    //重載下標運算符,實現與普通數組一樣通過下標訪問元素,并且具有越界檢查功能
    template
    T &Array::operator[] (int n) {
    assert(n >= 0 && n < size); //檢查下標是否越界
    return list[n]; //返回下標為n的數組元素
    }
    template
    const T &Array::operator[] (int n) const {
    assert(n >= 0 && n < size); //檢查下標是否越界
    return list[n]; //返回下標為n的數組元素
    }?
    //重載指針轉換運算符,將Array類的對象名轉換為T類型的指針
    template
    Array::operator T * () {
    return list; //返回當前對象中私有數組的首地址
    }
    ?
    template
    Array::operator const T * () const {
    return list; //返回當前對象中私有數組的首地址
    }
    //取當前數組的大小
    template
    int Array::getSize() const {
    return size;
    }
    // 將數組大小修改為sz
    template
    void Array::resize(int sz) {
    assert(sz >= 0); //檢查sz是否非負
    if (sz == size) //如果指定的大小與原有大小一樣,什么也不做
    return;
    T newList = new T [sz]; //申請新的數組內存
    int n = (sz < size) ? sz : size;//將sz與size中較小的一個賦值給n
    //將原有數組中前n個元素復制到新數組中
    for (int i = 0; i < n; i++)
    newList[i] = list[i];
    delete[] list; //刪除原數組
    list = newList; // 使list指向新數組
    size = sz; //更新size
    }
    #endif //ARRAY_H

    ##### 淺復制和深復制如果沒有對“=”重載,那么系統自動生成隱含的重載函數,給每個數據成員執行“=”運算符,也就是淺復制。所以當需要通過顯式定義復制構造函數執行深復制的時候,就需要重載賦值運算符。##### 與眾不同的運算符重載的“=”和“[]”返回值類型都是對象的引用,因為“=”左值不能為一個對象的值,對其賦值沒有意義,而“[]”經常需要作為左值,所以將“[]”返回值類型指定為對象的引用,通過引用可以改變對象的值。##### 指針轉換運算符的作用```c++ #include <iostream> using namespace std;void read(int *p, int n) {for (int i = 0; i < n; i++)cin >> p[i]; } int main() {int a[10];read(a, 10);return 0; }#include "Array.h" #include <iostream> using namespace std;void read(int *p, int n) {for (int i = 0; i < n; i++)cin >> p[i]; } int main() { Array<int> a(10);read(a, 10);return 0; }

    調用read函數的時候系統會嘗試把對象名轉換為int*類型,會編譯錯誤,所以需要定義指針類型轉換函數。

    //重載指針轉換運算符,將Array類的對象名轉換為T類型的指針 template <class T> Array<T>::operator T * () {return list; //返回當前對象中私有數組的首地址 }

    Array類的應用

    求范圍2~N中的質數,N在程序運行時由鍵盤輸入。

    #include <iostream> #include <iomanip> #include "Array.h" using namespace std; int main() {Array<int> a(10); // 用來存放質數的數組,初始狀態有10個元素。int n, count = 0;cout << "Enter a value >= 2 as upper limit for prime numbers: ";cin >> n;for (int i = 2; i <= n; i++) {bool isPrime = true;for (int j = 0; j < count; j++)if (i % a[j] == 0) { //若i被a[j]整除,說明i不是質數isPrime = false; break;}if (isPrime) { //如果質數表填滿了,將其空間加倍if (count == a.getSize()) a.resize(count * 2);a[count++] = i;}}for (int i = 0; i < count; i++) cout << setw(8) << a[i];cout << endl;return 0; }運行結果: Enter a value >= 2 as upper limit for prime numbers:1002 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

    總結

    以上是生活随笔為你收集整理的SCAU软件开发基础C++复习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久久久久久人妻无码中文字幕爆 | 亚洲国产精品久久人人爱 | 亚洲精品久久久久久一区二区 | 国产三级久久久精品麻豆三级 | 麻豆果冻传媒2021精品传媒一区下载 | 国产午夜无码视频在线观看 | 成人性做爰aaa片免费看 | 中国女人内谢69xxxx | 午夜成人1000部免费视频 | 国产黄在线观看免费观看不卡 | 精品国偷自产在线 | 2019午夜福利不卡片在线 | 一本大道伊人av久久综合 | 国产69精品久久久久app下载 | 人人妻人人澡人人爽人人精品浪潮 | 在线播放免费人成毛片乱码 | 99久久精品午夜一区二区 | 中文字幕人成乱码熟女app | 久久久久成人精品免费播放动漫 | 久久国产36精品色熟妇 | 夫妻免费无码v看片 | 欧美熟妇另类久久久久久不卡 | 亚洲经典千人经典日产 | 999久久久国产精品消防器材 | 亚洲成色在线综合网站 | 夜夜躁日日躁狠狠久久av | 噜噜噜亚洲色成人网站 | 成人亚洲精品久久久久软件 | 99精品视频在线观看免费 | 久久精品无码一区二区三区 | 日本欧美一区二区三区乱码 | 亚洲人成网站免费播放 | 粉嫩少妇内射浓精videos | 欧美成人高清在线播放 | 少妇无套内谢久久久久 | 欧美老妇交乱视频在线观看 | 亚洲自偷精品视频自拍 | 美女张开腿让人桶 | 国产精品a成v人在线播放 | 桃花色综合影院 | 麻豆国产97在线 | 欧洲 | 国产精品久久国产三级国 | 伊在人天堂亚洲香蕉精品区 | 小泽玛莉亚一区二区视频在线 | 97无码免费人妻超级碰碰夜夜 | 久久国产精品偷任你爽任你 | 欧美zoozzooz性欧美 | 亚洲中文字幕久久无码 | 国产精品久久久久久久影院 | 天天摸天天碰天天添 | 国产精品亚洲综合色区韩国 | 天堂亚洲2017在线观看 | 亚洲精品中文字幕久久久久 | 国产精品美女久久久 | 国产凸凹视频一区二区 | 少妇被粗大的猛进出69影院 | 妺妺窝人体色www婷婷 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产成人无码av在线影院 | 国产亚洲精品久久久闺蜜 | 国产亚洲精品久久久久久国模美 | 欧美野外疯狂做受xxxx高潮 | 一本色道婷婷久久欧美 | 强开小婷嫩苞又嫩又紧视频 | 啦啦啦www在线观看免费视频 | 久久综合色之久久综合 | 久久国语露脸国产精品电影 | 亚洲爆乳大丰满无码专区 | 精品无码国产自产拍在线观看蜜 | 自拍偷自拍亚洲精品被多人伦好爽 | 一个人看的www免费视频在线观看 | 国内精品一区二区三区不卡 | 久久亚洲日韩精品一区二区三区 | 国产午夜手机精彩视频 | 精品国产av色一区二区深夜久久 | 偷窥村妇洗澡毛毛多 | 欧美精品国产综合久久 | 国产精品毛多多水多 | 无码国产色欲xxxxx视频 | 亚洲日本在线电影 | 欧美精品一区二区精品久久 | 国产精品亚洲а∨无码播放麻豆 | 亚洲精品一区二区三区在线 | 亚洲国产高清在线观看视频 | 久久久亚洲欧洲日产国码αv | 国内精品一区二区三区不卡 | 亚洲国产精品一区二区美利坚 | 一本大道伊人av久久综合 | 国产人成高清在线视频99最全资源 | 国产农村妇女高潮大叫 | 蜜桃臀无码内射一区二区三区 | 性欧美牲交xxxxx视频 | 日韩精品无码免费一区二区三区 | 国产激情精品一区二区三区 | 亚洲精品一区三区三区在线观看 | 国产精品资源一区二区 | 国内综合精品午夜久久资源 | 97久久精品无码一区二区 | 无码av最新清无码专区吞精 | 国产亚av手机在线观看 | 综合人妻久久一区二区精品 | 无码中文字幕色专区 | 岛国片人妻三上悠亚 | 我要看www免费看插插视频 | 特级做a爰片毛片免费69 | 玩弄少妇高潮ⅹxxxyw | 亚洲经典千人经典日产 | 国产美女精品一区二区三区 | 人妻体内射精一区二区三四 | 亚洲成av人片天堂网无码】 | 午夜免费福利小电影 | 成人欧美一区二区三区 | 帮老师解开蕾丝奶罩吸乳网站 | 又紧又大又爽精品一区二区 | 国内精品久久毛片一区二区 | 国产三级久久久精品麻豆三级 | 国产精品手机免费 | 国产成人久久精品流白浆 | 国产真人无遮挡作爱免费视频 | 男人的天堂av网站 | 国产 浪潮av性色四虎 | 亚洲午夜无码久久 | 日产精品高潮呻吟av久久 | 国产精品香蕉在线观看 | 国产成人精品久久亚洲高清不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 麻豆人妻少妇精品无码专区 | 国产真实乱对白精彩久久 | 欧美三级a做爰在线观看 | 国产高清不卡无码视频 | 国产亚洲精品精品国产亚洲综合 | 黑人巨大精品欧美黑寡妇 | 久久综合九色综合欧美狠狠 | 中文字幕中文有码在线 | 麻豆成人精品国产免费 | 麻豆国产丝袜白领秘书在线观看 | 国产在线精品一区二区三区直播 | 男人和女人高潮免费网站 | 国产三级久久久精品麻豆三级 | 国产莉萝无码av在线播放 | 99久久99久久免费精品蜜桃 | 88国产精品欧美一区二区三区 | 久久国产精品萌白酱免费 | 风流少妇按摩来高潮 | 少妇被黑人到高潮喷出白浆 | 大屁股大乳丰满人妻 | 性啪啪chinese东北女人 | 精品无码成人片一区二区98 | 久久久久亚洲精品男人的天堂 | 天堂亚洲2017在线观看 | 国产精品a成v人在线播放 | 未满成年国产在线观看 | 好屌草这里只有精品 | 午夜成人1000部免费视频 | 四十如虎的丰满熟妇啪啪 | 性史性农村dvd毛片 | 亚洲区欧美区综合区自拍区 | 欧美成人免费全部网站 | 久久99精品国产麻豆蜜芽 | 日日麻批免费40分钟无码 | 红桃av一区二区三区在线无码av | 国产成人精品优优av | 亚洲精品鲁一鲁一区二区三区 | 内射巨臀欧美在线视频 | 成人无码视频免费播放 | 在线а√天堂中文官网 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲娇小与黑人巨大交 | 色欲综合久久中文字幕网 | 色综合久久久久综合一本到桃花网 | 真人与拘做受免费视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 欧美日韩在线亚洲综合国产人 | 一本大道伊人av久久综合 | 97色伦图片97综合影院 | 麻豆国产丝袜白领秘书在线观看 | 亚洲va中文字幕无码久久不卡 | 又色又爽又黄的美女裸体网站 | 丝袜足控一区二区三区 | 亚洲大尺度无码无码专区 | 久久精品女人天堂av免费观看 | 精品国产一区av天美传媒 | 亚洲aⅴ无码成人网站国产app | 国产热a欧美热a在线视频 | 中文无码精品a∨在线观看不卡 | 国产午夜亚洲精品不卡下载 | 色妞www精品免费视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 丰满人妻精品国产99aⅴ | 无码一区二区三区在线 | 中文字幕av伊人av无码av | 久久人人爽人人人人片 | 一本色道婷婷久久欧美 | a片免费视频在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 国产又粗又硬又大爽黄老大爷视 | 久久久中文久久久无码 | 亚洲国产av精品一区二区蜜芽 | 亚洲欧洲日本无在线码 | 男人扒开女人内裤强吻桶进去 | 欧美色就是色 | 久久亚洲中文字幕精品一区 | 亚洲欧美日韩成人高清在线一区 | 兔费看少妇性l交大片免费 | 国产办公室秘书无码精品99 | 欧美真人作爱免费视频 | 欧美丰满熟妇xxxx | 亚洲大尺度无码无码专区 | ass日本丰满熟妇pics | 日本精品人妻无码免费大全 | 亚洲码国产精品高潮在线 | 欧美 日韩 亚洲 在线 | 国产精品久久福利网站 | 日本大香伊一区二区三区 | 日日天日日夜日日摸 | 最新国产乱人伦偷精品免费网站 | 成人试看120秒体验区 | 日韩精品成人一区二区三区 | 中文字幕 人妻熟女 | 日韩精品久久久肉伦网站 | 亚洲欧美日韩国产精品一区二区 | 婷婷丁香五月天综合东京热 | 日本一区二区三区免费高清 | 久久久久久久人妻无码中文字幕爆 | 麻豆md0077饥渴少妇 | 纯爱无遮挡h肉动漫在线播放 | 中文字幕无线码 | 午夜福利试看120秒体验区 | 青青青手机频在线观看 | 麻豆国产丝袜白领秘书在线观看 | 久久人人97超碰a片精品 | 亚洲国产精品一区二区美利坚 | 久久久久成人精品免费播放动漫 | 男人扒开女人内裤强吻桶进去 | 欧美肥老太牲交大战 | 噜噜噜亚洲色成人网站 | 中文字幕日韩精品一区二区三区 | 中文无码精品a∨在线观看不卡 | 樱花草在线播放免费中文 | 无人区乱码一区二区三区 | 国产极品美女高潮无套在线观看 | 内射老妇bbwx0c0ck | 99久久亚洲精品无码毛片 | 久久亚洲中文字幕精品一区 | 久久综合给合久久狠狠狠97色 | 扒开双腿吃奶呻吟做受视频 | 日韩在线不卡免费视频一区 | 中文字幕人妻丝袜二区 | 日本又色又爽又黄的a片18禁 | 欧美性生交xxxxx久久久 | 亚洲第一无码av无码专区 | 精品无码av一区二区三区 | 亚洲色成人中文字幕网站 | 亚洲大尺度无码无码专区 | 伊人久久大香线蕉亚洲 | 77777熟女视频在线观看 а天堂中文在线官网 | 青青青手机频在线观看 | 免费看少妇作爱视频 | 国产乱人偷精品人妻a片 | 在线精品亚洲一区二区 | 色婷婷av一区二区三区之红樱桃 | 色窝窝无码一区二区三区色欲 | 天堂久久天堂av色综合 | 亚洲日韩乱码中文无码蜜桃臀网站 | 丰满人妻一区二区三区免费视频 | 国产女主播喷水视频在线观看 | 精品久久综合1区2区3区激情 | 一本大道久久东京热无码av | 日本丰满熟妇videos | 无码国产激情在线观看 | 日日碰狠狠躁久久躁蜜桃 | 亚洲第一无码av无码专区 | 亚洲爆乳无码专区 | 国产片av国语在线观看 | 无遮挡国产高潮视频免费观看 | 中文字幕无线码免费人妻 | 欧美日韩人成综合在线播放 | 久久久久免费精品国产 | 性欧美videos高清精品 | 国产亚洲精品久久久久久 | 亚洲精品一区二区三区大桥未久 | 久久精品女人天堂av免费观看 | 国精产品一区二区三区 | 国产在热线精品视频 | 国产乱人伦偷精品视频 | 欧美熟妇另类久久久久久不卡 | 久久精品国产一区二区三区 | 国内综合精品午夜久久资源 | 成人无码精品1区2区3区免费看 | 欧美乱妇无乱码大黄a片 | 日韩av激情在线观看 | 日本一区二区三区免费高清 | 又紧又大又爽精品一区二区 | 婷婷五月综合激情中文字幕 | 荫蒂被男人添的好舒服爽免费视频 | 沈阳熟女露脸对白视频 | 人人爽人人爽人人片av亚洲 | 丰满妇女强制高潮18xxxx | 少妇厨房愉情理9仑片视频 | 亚洲第一无码av无码专区 | 亚洲午夜久久久影院 | 99riav国产精品视频 | 男人扒开女人内裤强吻桶进去 | 国产午夜无码视频在线观看 | 少妇无码一区二区二三区 | 久久久久亚洲精品中文字幕 | 波多野结衣一区二区三区av免费 | 动漫av网站免费观看 | 欧洲欧美人成视频在线 | 中文无码成人免费视频在线观看 | 精品一区二区不卡无码av | 精品国产青草久久久久福利 | 久久亚洲精品成人无码 | 亚洲午夜福利在线观看 | 国产精品久久国产三级国 | 伊人色综合久久天天小片 | 人妻人人添人妻人人爱 | 动漫av一区二区在线观看 | 少妇性俱乐部纵欲狂欢电影 | 日韩人妻无码中文字幕视频 | 国产情侣作爱视频免费观看 | 强开小婷嫩苞又嫩又紧视频 | 国产av无码专区亚洲a∨毛片 | 无码人妻久久一区二区三区不卡 | 免费无码肉片在线观看 | 欧美亚洲国产一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产又爽又猛又粗的视频a片 | 一本一道久久综合久久 | 亚洲一区二区三区香蕉 | 四虎国产精品免费久久 | 99久久亚洲精品无码毛片 | 成熟女人特级毛片www免费 | 日韩精品无码一区二区中文字幕 | 久久国产自偷自偷免费一区调 | 成人av无码一区二区三区 | 色欲人妻aaaaaaa无码 | 国产精品人人妻人人爽 | av小次郎收藏 | 波多野结衣 黑人 | 一个人看的www免费视频在线观看 | 精品久久久久久人妻无码中文字幕 | 久久亚洲a片com人成 | 久久人人爽人人爽人人片av高清 | 美女黄网站人色视频免费国产 | 女人色极品影院 | 51国偷自产一区二区三区 | 国产精品亚洲一区二区三区喷水 | 少妇无码av无码专区在线观看 | 伊在人天堂亚洲香蕉精品区 | 亚洲熟妇色xxxxx亚洲 | 噜噜噜亚洲色成人网站 | 俺去俺来也www色官网 | aa片在线观看视频在线播放 | 精品一区二区三区无码免费视频 | 日韩少妇内射免费播放 | 国产真实伦对白全集 | 色婷婷综合激情综在线播放 | 夜夜高潮次次欢爽av女 | 精品无码一区二区三区的天堂 | 自拍偷自拍亚洲精品被多人伦好爽 | 日本护士xxxxhd少妇 | 永久免费观看国产裸体美女 | 无人区乱码一区二区三区 | 国产亚洲人成a在线v网站 | 国产一区二区三区影院 | 亚洲一区二区三区在线观看网站 | 日产精品高潮呻吟av久久 | 久久精品国产99久久6动漫 | 377p欧洲日本亚洲大胆 | 精品国产乱码久久久久乱码 | 午夜精品久久久久久久久 | 男女超爽视频免费播放 | 丰满岳乱妇在线观看中字无码 | 日本护士毛茸茸高潮 | 18精品久久久无码午夜福利 | 亚洲爆乳精品无码一区二区三区 | 精品偷自拍另类在线观看 | 亚洲男人av天堂午夜在 | 亚洲精品久久久久中文第一幕 | 亚洲理论电影在线观看 | 三级4级全黄60分钟 | 少妇被黑人到高潮喷出白浆 | 日韩人妻系列无码专区 | 国产后入清纯学生妹 | 国产欧美熟妇另类久久久 | 牛和人交xxxx欧美 | 领导边摸边吃奶边做爽在线观看 | 精品国产福利一区二区 | 亚洲中文字幕在线无码一区二区 | 久久精品国产一区二区三区 | 久久综合网欧美色妞网 | 老熟妇乱子伦牲交视频 | 国产无遮挡吃胸膜奶免费看 | 人人妻人人澡人人爽欧美一区 | 亚洲综合在线一区二区三区 | 国产后入清纯学生妹 | 又大又紧又粉嫩18p少妇 | 九九久久精品国产免费看小说 | 国产激情无码一区二区app | 国产精品鲁鲁鲁 | 无码国产激情在线观看 | 欧美激情内射喷水高潮 | 国产精品.xx视频.xxtv | 精品人妻人人做人人爽夜夜爽 | 国产精品久久久久久久9999 | 女人被男人爽到呻吟的视频 | 亚洲精品午夜无码电影网 | 亚洲精品中文字幕 | 东京无码熟妇人妻av在线网址 | 亚洲国产欧美日韩精品一区二区三区 | 窝窝午夜理论片影院 | 日韩欧美成人免费观看 | 亚洲色欲色欲欲www在线 | 风流少妇按摩来高潮 | 国产美女极度色诱视频www | 国产黄在线观看免费观看不卡 | 久久综合香蕉国产蜜臀av | 黑人巨大精品欧美黑寡妇 | 东京一本一道一二三区 | 亚洲精品国产a久久久久久 | 一本色道婷婷久久欧美 | 国产午夜亚洲精品不卡 | 久久久中文久久久无码 | 亚洲精品一区二区三区婷婷月 | 窝窝午夜理论片影院 | 粉嫩少妇内射浓精videos | 沈阳熟女露脸对白视频 | 色综合久久久无码中文字幕 | 国产一区二区三区四区五区加勒比 | 国产97在线 | 亚洲 | 久久国产精品_国产精品 | 久久综合激激的五月天 | 欧美老熟妇乱xxxxx | 99久久久无码国产精品免费 | 中文无码成人免费视频在线观看 | 亚洲一区二区三区四区 | 少妇性l交大片 | 88国产精品欧美一区二区三区 | 亚洲国产av美女网站 | 免费无码肉片在线观看 | 野外少妇愉情中文字幕 | 欧洲欧美人成视频在线 | 国产精品爱久久久久久久 | 精品aⅴ一区二区三区 | 激情五月综合色婷婷一区二区 | 亚洲人亚洲人成电影网站色 | 久久精品国产一区二区三区肥胖 | 丝袜人妻一区二区三区 | 国产成人精品优优av | 亚洲国产精品无码久久久久高潮 | 日日碰狠狠躁久久躁蜜桃 | 久久精品国产一区二区三区肥胖 | 麻豆蜜桃av蜜臀av色欲av | 伊人久久大香线蕉午夜 | 天天摸天天碰天天添 | 亚洲国产综合无码一区 | 97夜夜澡人人双人人人喊 | 国产成人综合在线女婷五月99播放 | 中文字幕+乱码+中文字幕一区 | 无码人妻av免费一区二区三区 | 国产av无码专区亚洲a∨毛片 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 精品一二三区久久aaa片 | 国产又爽又黄又刺激的视频 | 人妻有码中文字幕在线 | 亚洲日韩一区二区三区 | 精品国产青草久久久久福利 | 欧美激情一区二区三区成人 | 97夜夜澡人人双人人人喊 | 日韩亚洲欧美精品综合 | 亚洲aⅴ无码成人网站国产app | 偷窥村妇洗澡毛毛多 | 丰满少妇高潮惨叫视频 | 欧美人与禽zoz0性伦交 | 亚洲色大成网站www国产 | 高清无码午夜福利视频 | 色一情一乱一伦一区二区三欧美 | 色婷婷香蕉在线一区二区 | 国产av一区二区三区最新精品 | 中文字幕无码视频专区 | 久久www免费人成人片 | 国产成人精品久久亚洲高清不卡 | 一本久道久久综合狠狠爱 | 强开小婷嫩苞又嫩又紧视频 | аⅴ资源天堂资源库在线 | 久久99精品久久久久久动态图 | 一个人看的www免费视频在线观看 | 国产精品嫩草久久久久 | 亚洲精品午夜国产va久久成人 | 中文字幕av伊人av无码av | 天堂а√在线地址中文在线 | 无码人妻少妇伦在线电影 | 无码帝国www无码专区色综合 | 日本护士xxxxhd少妇 | 人人爽人人爽人人片av亚洲 | 久久精品中文字幕大胸 | 亚洲国产精品久久人人爱 | 人妻中文无码久热丝袜 | 亚洲成色在线综合网站 | 国产av无码专区亚洲awww | 免费人成网站视频在线观看 | 性史性农村dvd毛片 | 荫蒂添的好舒服视频囗交 | 国产9 9在线 | 中文 | 亚洲国产高清在线观看视频 | 丁香花在线影院观看在线播放 | 欧美精品免费观看二区 | 亚洲人成网站色7799 | 国内少妇偷人精品视频 | 男人扒开女人内裤强吻桶进去 | 国产内射爽爽大片视频社区在线 | 日日摸夜夜摸狠狠摸婷婷 | 久久人人97超碰a片精品 | 精品人妻av区 | 色老头在线一区二区三区 | 国产特级毛片aaaaaaa高清 | 兔费看少妇性l交大片免费 | 巨爆乳无码视频在线观看 | 1000部夫妻午夜免费 | 99精品无人区乱码1区2区3区 | 性生交大片免费看l | 老子影院午夜精品无码 | 亚洲a无码综合a国产av中文 | 熟女俱乐部五十路六十路av | 强辱丰满人妻hd中文字幕 | 好男人社区资源 | 少妇无码一区二区二三区 | 色 综合 欧美 亚洲 国产 | 98国产精品综合一区二区三区 | 无码一区二区三区在线 | 九月婷婷人人澡人人添人人爽 | 国产精品久久久久久亚洲毛片 | 国产明星裸体无码xxxx视频 | 国产午夜福利100集发布 | 午夜性刺激在线视频免费 | 成年美女黄网站色大免费视频 | 国产午夜手机精彩视频 | 国产一区二区三区影院 | 啦啦啦www在线观看免费视频 | 一区二区三区高清视频一 | 成人无码精品一区二区三区 | 日韩人妻系列无码专区 | 亚洲gv猛男gv无码男同 | 日本高清一区免费中文视频 | 国内综合精品午夜久久资源 | 在线a亚洲视频播放在线观看 | 欧美一区二区三区视频在线观看 | 天堂а√在线地址中文在线 | 国内揄拍国内精品少妇国语 | 日韩欧美中文字幕公布 | 国产精品无码一区二区三区不卡 | 无码精品人妻一区二区三区av | 日本精品人妻无码免费大全 | 日本护士xxxxhd少妇 | 男女性色大片免费网站 | www国产亚洲精品久久网站 | 国产乱码精品一品二品 | 性色欲网站人妻丰满中文久久不卡 | 日本熟妇人妻xxxxx人hd | 无码人妻久久一区二区三区不卡 | 色五月丁香五月综合五月 | 精品国精品国产自在久国产87 | 亚洲精品久久久久avwww潮水 | 精品久久久久久人妻无码中文字幕 | 久久久久99精品国产片 | 中文字幕人妻丝袜二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久精品成人免费观看 | 男女性色大片免费网站 | 麻豆国产人妻欲求不满 | 奇米影视7777久久精品人人爽 | 亚洲色欲久久久综合网东京热 | 97久久国产亚洲精品超碰热 | 色婷婷综合中文久久一本 | 日本大香伊一区二区三区 | 久久久精品欧美一区二区免费 | 中文字幕+乱码+中文字幕一区 | 久久99精品久久久久久动态图 | 两性色午夜免费视频 | 欧美黑人乱大交 | 无码精品国产va在线观看dvd | 永久免费观看国产裸体美女 | www国产精品内射老师 | 久久综合狠狠综合久久综合88 | 中文字幕中文有码在线 | 97久久精品无码一区二区 | 99精品视频在线观看免费 | 免费乱码人妻系列无码专区 | 无码av免费一区二区三区试看 | 国产精品18久久久久久麻辣 | 亚洲熟妇自偷自拍另类 | 国产精品多人p群无码 | 久久国产36精品色熟妇 | 荫蒂被男人添的好舒服爽免费视频 | 熟妇人妻中文av无码 | 一本久久a久久精品亚洲 | 亚洲精品国产精品乱码视色 | 麻豆国产丝袜白领秘书在线观看 | 午夜成人1000部免费视频 | 国产偷国产偷精品高清尤物 | 又湿又紧又大又爽a视频国产 | 中文字幕中文有码在线 | 无码人妻丰满熟妇区五十路百度 | 中文字幕av伊人av无码av | 久久99热只有频精品8 | 永久免费观看国产裸体美女 | 成人动漫在线观看 | 在线 国产 欧美 亚洲 天堂 | 日日橹狠狠爱欧美视频 | 亚洲精品国产第一综合99久久 | 国产情侣作爱视频免费观看 | aa片在线观看视频在线播放 | 2019午夜福利不卡片在线 | 国产精品欧美成人 | 中文字幕精品av一区二区五区 | 亚洲中文字幕无码中文字在线 | 成人免费视频在线观看 | 中文字幕中文有码在线 | 国内少妇偷人精品视频 | 无码成人精品区在线观看 | 西西人体www44rt大胆高清 | 亚洲精品国产第一综合99久久 | 久久无码专区国产精品s | 欧美人与物videos另类 | 中文亚洲成a人片在线观看 | 国产口爆吞精在线视频 | 丰满诱人的人妻3 | 久久久www成人免费毛片 | 国产熟女一区二区三区四区五区 | 欧洲熟妇精品视频 | 秋霞成人午夜鲁丝一区二区三区 | 强伦人妻一区二区三区视频18 | 欧美成人家庭影院 | 麻豆蜜桃av蜜臀av色欲av | 久精品国产欧美亚洲色aⅴ大片 | 全球成人中文在线 | 亚洲精品无码国产 | 国产精品手机免费 | 精品日本一区二区三区在线观看 | 免费国产成人高清在线观看网站 | 成人性做爰aaa片免费看不忠 | 福利一区二区三区视频在线观看 | 又大又黄又粗又爽的免费视频 | 中文字幕无码av波多野吉衣 | 精品久久久中文字幕人妻 | 日本高清一区免费中文视频 | 国产特级毛片aaaaaa高潮流水 | 国产另类ts人妖一区二区 | 奇米影视7777久久精品 | 一个人看的视频www在线 | 狠狠噜狠狠狠狠丁香五月 | 少妇性俱乐部纵欲狂欢电影 | 99久久久无码国产aaa精品 | 欧美日本免费一区二区三区 | 亚洲高清偷拍一区二区三区 | 国精产品一区二区三区 | 精品国产国产综合精品 | 精品国产福利一区二区 | 日本va欧美va欧美va精品 | 国产色xx群视频射精 | 欧美放荡的少妇 | 亚洲s色大片在线观看 | 熟女少妇在线视频播放 | 2019午夜福利不卡片在线 | 国产香蕉尹人视频在线 | 久久亚洲精品成人无码 | 男人和女人高潮免费网站 | 国产一区二区三区精品视频 | 亲嘴扒胸摸屁股激烈网站 | 亚洲精品一区二区三区四区五区 | 在线观看国产一区二区三区 | 日本又色又爽又黄的a片18禁 | 精品无码一区二区三区的天堂 | 四虎永久在线精品免费网址 | 国产凸凹视频一区二区 | 午夜理论片yy44880影院 | 麻花豆传媒剧国产免费mv在线 | 狠狠色色综合网站 | 风流少妇按摩来高潮 | 久久亚洲日韩精品一区二区三区 | а√天堂www在线天堂小说 | 国产精品毛片一区二区 | 精品久久久中文字幕人妻 | 色婷婷久久一区二区三区麻豆 | 亚洲精品午夜国产va久久成人 | 欧美放荡的少妇 | 少妇无套内谢久久久久 | 美女毛片一区二区三区四区 | 少妇性l交大片欧洲热妇乱xxx | 人人澡人人妻人人爽人人蜜桃 | 中文字幕久久久久人妻 | 日韩精品成人一区二区三区 | 欧美熟妇另类久久久久久不卡 | 色五月丁香五月综合五月 | 国产精品二区一区二区aⅴ污介绍 | 色综合久久88色综合天天 | 强伦人妻一区二区三区视频18 | 日韩欧美中文字幕在线三区 | 日本饥渴人妻欲求不满 | 国产网红无码精品视频 | 精品国产青草久久久久福利 | 成人女人看片免费视频放人 | 狠狠躁日日躁夜夜躁2020 | 国产亲子乱弄免费视频 | 国产亚洲人成在线播放 | 久久久久久a亚洲欧洲av冫 | 亚洲色欲久久久综合网东京热 | 免费视频欧美无人区码 | 精品欧洲av无码一区二区三区 | 网友自拍区视频精品 | 日韩精品无码一本二本三本色 | 精品国产成人一区二区三区 | 国产成人无码专区 | 精品国偷自产在线 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久久av男人的天堂 | 帮老师解开蕾丝奶罩吸乳网站 | 久久综合九色综合欧美狠狠 | 天天拍夜夜添久久精品 | 国产免费无码一区二区视频 | 国产成人一区二区三区别 | 国产一区二区不卡老阿姨 | 强伦人妻一区二区三区视频18 | 免费播放一区二区三区 | 成人av无码一区二区三区 | 亚洲精品午夜国产va久久成人 | 欧美肥老太牲交大战 | 天下第一社区视频www日本 | 亚洲国产一区二区三区在线观看 | 亚洲一区二区三区含羞草 | 一本久久伊人热热精品中文字幕 | 日日摸日日碰夜夜爽av | 女人被男人爽到呻吟的视频 | 少妇太爽了在线观看 | 午夜福利试看120秒体验区 | 欧美人与禽猛交狂配 | 高清无码午夜福利视频 | 国内老熟妇对白xxxxhd | 无码国产色欲xxxxx视频 | 亚洲精品一区二区三区在线观看 | 色窝窝无码一区二区三区色欲 | 国产一区二区不卡老阿姨 | 精品无码国产一区二区三区av | 欧美人与禽猛交狂配 | 久久成人a毛片免费观看网站 | 最新国产乱人伦偷精品免费网站 | 亚洲中文字幕无码一久久区 | 久久国产自偷自偷免费一区调 | 无码一区二区三区在线 | 国产无av码在线观看 | 最近的中文字幕在线看视频 | 欧美国产日韩久久mv | 亚洲中文字幕va福利 | 亚洲人成网站免费播放 | 少妇人妻av毛片在线看 | 99精品视频在线观看免费 | 六月丁香婷婷色狠狠久久 | 成 人 网 站国产免费观看 | 欧美国产亚洲日韩在线二区 | 青青久在线视频免费观看 | 欧美黑人乱大交 | 国产av一区二区三区最新精品 | 一本久道久久综合婷婷五月 | 色婷婷久久一区二区三区麻豆 | 精品无人国产偷自产在线 | 亚洲国产高清在线观看视频 | 国产精品igao视频网 | 一本久道高清无码视频 | 东京无码熟妇人妻av在线网址 | 小泽玛莉亚一区二区视频在线 | 国产精品无码mv在线观看 | 兔费看少妇性l交大片免费 | 欧美黑人性暴力猛交喷水 | 国产在线aaa片一区二区99 | 国产午夜亚洲精品不卡 | 未满小14洗澡无码视频网站 | 捆绑白丝粉色jk震动捧喷白浆 | 国产亚洲视频中文字幕97精品 | 国产精品福利视频导航 | 亚洲乱码日产精品bd | 国产电影无码午夜在线播放 | 欧美丰满少妇xxxx性 | 亚洲一区二区三区四区 | 国产欧美熟妇另类久久久 | 久久99精品久久久久久 | 九月婷婷人人澡人人添人人爽 | 激情五月综合色婷婷一区二区 | 波多野结衣av一区二区全免费观看 | 久久久久久久女国产乱让韩 | 妺妺窝人体色www在线小说 | 97夜夜澡人人双人人人喊 | 国产亚av手机在线观看 | 少女韩国电视剧在线观看完整 | 丰满少妇弄高潮了www | 日韩人妻无码中文字幕视频 | 人妻插b视频一区二区三区 | 精品一区二区三区无码免费视频 | 夜夜高潮次次欢爽av女 | 一本无码人妻在中文字幕免费 | 久久久国产精品无码免费专区 | 久久国产自偷自偷免费一区调 | 人人妻人人澡人人爽人人精品浪潮 | 国产成人无码午夜视频在线观看 | 久久综合色之久久综合 | 波多野结衣一区二区三区av免费 | 男女超爽视频免费播放 | 正在播放老肥熟妇露脸 | 欧美野外疯狂做受xxxx高潮 | 免费人成在线视频无码 | 亚洲精品久久久久中文第一幕 | 久久久国产精品无码免费专区 | 精品无码成人片一区二区98 | 漂亮人妻洗澡被公强 日日躁 | 欧美性生交xxxxx久久久 | 97久久超碰中文字幕 | 日本乱偷人妻中文字幕 | 欧美一区二区三区视频在线观看 | 乱人伦中文视频在线观看 | 久久精品中文闷骚内射 | 久久99久久99精品中文字幕 | 日本一区二区三区免费高清 | 久久午夜无码鲁丝片秋霞 | 午夜理论片yy44880影院 | www一区二区www免费 | 亚洲国产精品久久人人爱 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲综合另类小说色区 | 丰满肥臀大屁股熟妇激情视频 | 亚洲精品综合一区二区三区在线 | 国产片av国语在线观看 | 无码人妻少妇伦在线电影 | 图片区 小说区 区 亚洲五月 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲s码欧洲m码国产av | 女人被男人爽到呻吟的视频 | 亚洲va中文字幕无码久久不卡 | 日本一卡二卡不卡视频查询 | 999久久久国产精品消防器材 | 亚洲最大成人网站 | 亚洲人成无码网www | 美女张开腿让人桶 | 精品久久综合1区2区3区激情 | 国产一区二区三区日韩精品 | 在线 国产 欧美 亚洲 天堂 | 人妻aⅴ无码一区二区三区 | 久久久精品国产sm最大网站 | 麻豆人妻少妇精品无码专区 | 亚洲男女内射在线播放 | 无人区乱码一区二区三区 | 人妻有码中文字幕在线 | 国产精华av午夜在线观看 | 国产精品亚洲综合色区韩国 | 亚洲欧美色中文字幕在线 | 我要看www免费看插插视频 | 国产乱人伦av在线无码 | 日日鲁鲁鲁夜夜爽爽狠狠 | 精品国产av色一区二区深夜久久 | 色婷婷av一区二区三区之红樱桃 | 国产无套内射久久久国产 | 亚洲人成影院在线无码按摩店 | 中文无码成人免费视频在线观看 | 麻豆国产人妻欲求不满谁演的 | 水蜜桃av无码 | 欧美精品在线观看 | 久久久无码中文字幕久... | 国产女主播喷水视频在线观看 | 国产无套粉嫩白浆在线 | 国产亚洲精品久久久久久久久动漫 | 久久久久免费精品国产 | 亚洲国产精品美女久久久久 | 55夜色66夜色国产精品视频 | 高潮毛片无遮挡高清免费 | 国产成人精品视频ⅴa片软件竹菊 | 任你躁在线精品免费 | 国产欧美精品一区二区三区 | 少妇高潮一区二区三区99 | 性史性农村dvd毛片 | 久久精品无码一区二区三区 | 久久亚洲精品中文字幕无男同 | 国产猛烈高潮尖叫视频免费 | 亚洲综合另类小说色区 | 97se亚洲精品一区 | 无码毛片视频一区二区本码 | 无码毛片视频一区二区本码 | 亚洲综合无码久久精品综合 | 麻花豆传媒剧国产免费mv在线 | 国模大胆一区二区三区 | 欧美日本精品一区二区三区 | 377p欧洲日本亚洲大胆 | 久久天天躁狠狠躁夜夜免费观看 | www国产亚洲精品久久久日本 | 久久亚洲a片com人成 | 中文字幕日韩精品一区二区三区 | 九九综合va免费看 | 一个人看的www免费视频在线观看 | 日本一区二区三区免费高清 | 成 人 免费观看网站 | 亚洲国产精品无码久久久久高潮 | 一本久道久久综合婷婷五月 | 国产精品久久久久久无码 | 国产真实伦对白全集 | 欧美熟妇另类久久久久久多毛 | 人妻中文无码久热丝袜 | 四虎影视成人永久免费观看视频 | 国产av无码专区亚洲awww | 国产精品久久久久久久影院 | 午夜无码人妻av大片色欲 | 精品乱码久久久久久久 | 国产精品久久久久9999小说 | 午夜理论片yy44880影院 | 久久精品99久久香蕉国产色戒 | 少妇高潮喷潮久久久影院 | 日韩成人一区二区三区在线观看 | 爱做久久久久久 | 无码一区二区三区在线观看 | 精品国产福利一区二区 | 曰韩无码二三区中文字幕 | 精品国产一区二区三区av 性色 | 亚洲综合精品香蕉久久网 | 天堂а√在线中文在线 | 蜜臀aⅴ国产精品久久久国产老师 | 久久午夜无码鲁丝片 | 美女黄网站人色视频免费国产 | 无码国产乱人伦偷精品视频 | 国产猛烈高潮尖叫视频免费 | 狠狠cao日日穞夜夜穞av | 夫妻免费无码v看片 | 久久久久久av无码免费看大片 | 国产极品视觉盛宴 | 曰韩少妇内射免费播放 | 欧洲极品少妇 | 成人av无码一区二区三区 | 熟妇人妻激情偷爽文 | 国产成人综合美国十次 | 成人性做爰aaa片免费看 | 男人和女人高潮免费网站 | 成人片黄网站色大片免费观看 | 欧美老熟妇乱xxxxx | 又大又硬又黄的免费视频 | 全球成人中文在线 | 夜夜躁日日躁狠狠久久av | 人妻无码αv中文字幕久久琪琪布 | 亚洲无人区午夜福利码高清完整版 | 日本www一道久久久免费榴莲 | 粉嫩少妇内射浓精videos | 漂亮人妻洗澡被公强 日日躁 | 麻豆国产人妻欲求不满 | 日本高清一区免费中文视频 | 综合激情五月综合激情五月激情1 | 日韩人妻少妇一区二区三区 | 久久97精品久久久久久久不卡 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品一区二区三区在线观看 | 日本大乳高潮视频在线观看 | 久久久久久久久888 | 色诱久久久久综合网ywww | 国产超碰人人爽人人做人人添 | 人人妻人人藻人人爽欧美一区 | 免费观看又污又黄的网站 | 水蜜桃av无码 | 漂亮人妻洗澡被公强 日日躁 | 伦伦影院午夜理论片 | 久久久久久国产精品无码下载 | 大地资源中文第3页 | 亚洲乱亚洲乱妇50p | 国产精品美女久久久久av爽李琼 | 性欧美大战久久久久久久 | 2020久久香蕉国产线看观看 | 亚洲成a人一区二区三区 | 在线欧美精品一区二区三区 | 波多野结衣av在线观看 | 亚洲综合在线一区二区三区 | 人妻有码中文字幕在线 | 无码人妻出轨黑人中文字幕 | 免费播放一区二区三区 | 精品国偷自产在线 | 亚洲aⅴ无码成人网站国产app | 波多野结衣av在线观看 | 鲁大师影院在线观看 | 国产婷婷色一区二区三区在线 | 亚洲人成网站免费播放 | av无码电影一区二区三区 | 久久久亚洲欧洲日产国码αv | 国产手机在线αⅴ片无码观看 | 日韩av无码一区二区三区 | 少妇被黑人到高潮喷出白浆 | 中文字幕av伊人av无码av | 成人精品天堂一区二区三区 | 亚洲春色在线视频 | 人人妻人人澡人人爽欧美一区九九 | 国产两女互慰高潮视频在线观看 | 无码纯肉视频在线观看 | 狂野欧美激情性xxxx | 男女爱爱好爽视频免费看 | 亚洲精品久久久久久久久久久 | 人妻aⅴ无码一区二区三区 | 啦啦啦www在线观看免费视频 | 中文无码精品a∨在线观看不卡 | 无码人妻黑人中文字幕 | 18无码粉嫩小泬无套在线观看 | 国产国语老龄妇女a片 | 草草网站影院白丝内射 | 国内少妇偷人精品视频 | 亚洲欧洲日本综合aⅴ在线 | 久久亚洲精品中文字幕无男同 | 少妇被黑人到高潮喷出白浆 | 日日躁夜夜躁狠狠躁 | 精品国产国产综合精品 | 国产精品久免费的黄网站 | 内射爽无广熟女亚洲 | 亚洲精品成a人在线观看 | 人妻尝试又大又粗久久 | 精品人妻人人做人人爽 | 一个人免费观看的www视频 | 亚洲a无码综合a国产av中文 | 精品人妻人人做人人爽夜夜爽 | 毛片内射-百度 | 黄网在线观看免费网站 | 精品aⅴ一区二区三区 | 国产人妖乱国产精品人妖 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产精品资源一区二区 | 亚洲午夜福利在线观看 | 久久久国产精品无码免费专区 | 疯狂三人交性欧美 | 国产日产欧产精品精品app | 人人澡人人妻人人爽人人蜜桃 | 中文无码伦av中文字幕 | 夜夜夜高潮夜夜爽夜夜爰爰 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产成人亚洲综合无码 | 丰满护士巨好爽好大乳 | 亚洲中文字幕久久无码 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产性生大片免费观看性 | 日韩精品久久久肉伦网站 | 一二三四在线观看免费视频 | 无遮挡国产高潮视频免费观看 | 中文字幕+乱码+中文字幕一区 | 99精品国产综合久久久久五月天 | av无码电影一区二区三区 | 国产精品久免费的黄网站 | 偷窥日本少妇撒尿chinese | 性史性农村dvd毛片 | 久久精品中文字幕大胸 | 娇妻被黑人粗大高潮白浆 | 无码人妻少妇伦在线电影 | 日韩av无码中文无码电影 | v一区无码内射国产 | 成人性做爰aaa片免费看 | 无码av最新清无码专区吞精 | 亚洲 a v无 码免 费 成 人 a v | 最新版天堂资源中文官网 | 国产农村妇女高潮大叫 | 又大又紧又粉嫩18p少妇 | 丝袜 中出 制服 人妻 美腿 | 精品久久久久久亚洲精品 | 精品午夜福利在线观看 | 国产片av国语在线观看 | 午夜无码人妻av大片色欲 | 成人三级无码视频在线观看 | 无码人妻精品一区二区三区下载 | 亚洲人成人无码网www国产 | 免费观看黄网站 | 波多野结衣av在线观看 | 久久精品国产大片免费观看 | 亚洲熟妇色xxxxx欧美老妇 | 又大又黄又粗又爽的免费视频 | 狠狠噜狠狠狠狠丁香五月 | 99久久精品午夜一区二区 | 丰满人妻被黑人猛烈进入 | 国产在线无码精品电影网 | 色综合久久久无码网中文 | 国产美女精品一区二区三区 | 日韩精品a片一区二区三区妖精 | 国产av人人夜夜澡人人爽麻豆 | 亚洲а∨天堂久久精品2021 | 国产卡一卡二卡三 | 无码午夜成人1000部免费视频 | 99久久无码一区人妻 | 国产两女互慰高潮视频在线观看 | 久久99热只有频精品8 | 无遮挡啪啪摇乳动态图 | 亚洲 a v无 码免 费 成 人 a v | 久久99精品久久久久婷婷 | 欧美一区二区三区视频在线观看 | 国色天香社区在线视频 | 亚洲成a人片在线观看无码 | 成人av无码一区二区三区 | 99久久婷婷国产综合精品青草免费 | 免费人成在线视频无码 | 国产人妻人伦精品1国产丝袜 | 国产偷自视频区视频 | 久久久中文久久久无码 | 精品无码国产一区二区三区av | 色婷婷av一区二区三区之红樱桃 | 亚洲欧美综合区丁香五月小说 | 97资源共享在线视频 | 国产国产精品人在线视 | 国产片av国语在线观看 | 东京热一精品无码av | 77777熟女视频在线观看 а天堂中文在线官网 | 国产精品理论片在线观看 | 欧美丰满熟妇xxxx | 99精品国产综合久久久久五月天 | 成人性做爰aaa片免费看 | 女人被爽到呻吟gif动态图视看 | 国内老熟妇对白xxxxhd | 亚洲人交乣女bbw | 亚洲欧美日韩综合久久久 | 日韩视频 中文字幕 视频一区 | 日日摸日日碰夜夜爽av | 欧美日本日韩 | 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕 人妻熟女 | 国产精品亚洲专区无码不卡 | 国产成人无码午夜视频在线观看 | 欧美阿v高清资源不卡在线播放 | 性色av无码免费一区二区三区 | 精品熟女少妇av免费观看 | 亚洲色偷偷偷综合网 | 国产深夜福利视频在线 | 国产精华av午夜在线观看 | 久久无码专区国产精品s | 午夜精品久久久久久久久 | 精品无码成人片一区二区98 | 久激情内射婷内射蜜桃人妖 | 中文亚洲成a人片在线观看 | 久久久久成人精品免费播放动漫 | 久久久久免费看成人影片 | 中文字幕久久久久人妻 | 精品国产一区二区三区av 性色 | 日日摸天天摸爽爽狠狠97 | 东京热一精品无码av | 18无码粉嫩小泬无套在线观看 | 一二三四社区在线中文视频 | 亚洲国产精品无码久久久久高潮 | 最新国产麻豆aⅴ精品无码 | 久久久国产一区二区三区 | 内射欧美老妇wbb | 97se亚洲精品一区 | 久久久婷婷五月亚洲97号色 | 亚洲区小说区激情区图片区 | 中文字幕 人妻熟女 | 亚洲大尺度无码无码专区 | 狂野欧美性猛xxxx乱大交 | 少妇无码一区二区二三区 | 中文字幕亚洲情99在线 | 色综合久久久无码网中文 | 国产色视频一区二区三区 | 天堂一区人妻无码 | 精品国产aⅴ无码一区二区 | 欧美性猛交xxxx富婆 | 黑人粗大猛烈进出高潮视频 | 国产午夜亚洲精品不卡 | 精品国产aⅴ无码一区二区 | 亚洲区小说区激情区图片区 | 大地资源网第二页免费观看 | 亚洲成熟女人毛毛耸耸多 | 性做久久久久久久久 | 少妇无码一区二区二三区 | 国产精品无码成人午夜电影 | 日本成熟视频免费视频 | 波多野结衣 黑人 | 少妇无码av无码专区在线观看 | 欧美亚洲国产一区二区三区 | 少妇高潮喷潮久久久影院 | 亚洲精品久久久久久久久久久 | 久久久av男人的天堂 | 国产亚洲日韩欧美另类第八页 | 婷婷丁香六月激情综合啪 | 性色欲网站人妻丰满中文久久不卡 | 成在人线av无码免观看麻豆 | 亚洲狠狠色丁香婷婷综合 | 亚洲小说春色综合另类 | 女人色极品影院 | 国产精品va在线观看无码 | 又大又黄又粗又爽的免费视频 | 久久久国产精品无码免费专区 | 无码人妻精品一区二区三区不卡 | 亚洲s色大片在线观看 | 精品一区二区不卡无码av | 免费国产黄网站在线观看 | 久久久精品国产sm最大网站 | 未满成年国产在线观看 | 亚洲中文字幕av在天堂 | a在线亚洲男人的天堂 | 久久久久免费精品国产 | 国产精品美女久久久久av爽李琼 | 成在人线av无码免费 | 欧美怡红院免费全部视频 | 欧美xxxx黑人又粗又长 | 亚洲最大成人网站 | 少妇被黑人到高潮喷出白浆 | 成人综合网亚洲伊人 | 久久午夜无码鲁丝片午夜精品 | 亚洲色欲色欲欲www在线 | 高清不卡一区二区三区 | 精品国产青草久久久久福利 | 精品国产精品久久一区免费式 | 天干天干啦夜天干天2017 | 欧美三级a做爰在线观看 | 波多野42部无码喷潮在线 | 骚片av蜜桃精品一区 | 日日摸天天摸爽爽狠狠97 | 亚洲欧美国产精品专区久久 | 午夜不卡av免费 一本久久a久久精品vr综合 | 高清国产亚洲精品自在久久 | 麻豆蜜桃av蜜臀av色欲av | 日韩av无码一区二区三区 | 色综合久久网 | 久久久久成人精品免费播放动漫 | 亚洲欧美色中文字幕在线 | 老子影院午夜精品无码 | 亚洲日本在线电影 | 久久久婷婷五月亚洲97号色 | 99麻豆久久久国产精品免费 | 97久久超碰中文字幕 | 亚洲乱码中文字幕在线 | 高潮毛片无遮挡高清免费视频 | 日本肉体xxxx裸交 | 自拍偷自拍亚洲精品被多人伦好爽 | 色五月五月丁香亚洲综合网 | 特大黑人娇小亚洲女 | 131美女爱做视频 | 国产精品久久福利网站 | 好屌草这里只有精品 | 国产免费久久精品国产传媒 | 俺去俺来也www色官网 | 波多野结衣av在线观看 | 日韩欧美群交p片內射中文 | 色综合久久久无码中文字幕 | 亚洲中文字幕乱码av波多ji | 国产农村乱对白刺激视频 | 丝袜足控一区二区三区 | 亚洲va中文字幕无码久久不卡 | 国内精品一区二区三区不卡 | 少妇太爽了在线观看 | 性做久久久久久久久 | 亚洲综合无码一区二区三区 | 大乳丰满人妻中文字幕日本 | 免费播放一区二区三区 | 欧美老人巨大xxxx做受 | 乱码av麻豆丝袜熟女系列 | 成人试看120秒体验区 | 亚洲精品无码国产 | 无码人中文字幕 | 娇妻被黑人粗大高潮白浆 | 国内揄拍国内精品少妇国语 | 一区二区三区乱码在线 | 欧洲 | 国产国语老龄妇女a片 | 欧美国产日韩久久mv | 无码一区二区三区在线观看 | 丰满少妇高潮惨叫视频 | 国产av无码专区亚洲awww | 中文字幕无码av激情不卡 | 成人免费无码大片a毛片 | 国产精品手机免费 | 麻豆md0077饥渴少妇 | 一本久久伊人热热精品中文字幕 | 俺去俺来也在线www色官网 | 久久国产精品精品国产色婷婷 | 亚洲人成网站色7799 | 亚洲精品一区三区三区在线观看 | 亚洲综合精品香蕉久久网 | 亚洲国产精华液网站w | 丰满人妻精品国产99aⅴ | 精品国产一区二区三区四区在线看 | 熟女体下毛毛黑森林 | 又大又硬又爽免费视频 | av无码不卡在线观看免费 | 鲁一鲁av2019在线 | 中文字幕中文有码在线 | 亚洲精品一区二区三区婷婷月 | 99久久精品日本一区二区免费 | 国产精品成人av在线观看 | 亚洲小说图区综合在线 | 丰满人妻一区二区三区免费视频 | 蜜臀aⅴ国产精品久久久国产老师 | 99精品视频在线观看免费 | 久久亚洲中文字幕无码 | 久久久久99精品国产片 | 色窝窝无码一区二区三区色欲 | 日本一卡2卡3卡四卡精品网站 | 亚洲一区二区三区无码久久 | aa片在线观看视频在线播放 | 亚洲人成影院在线无码按摩店 | www国产精品内射老师 | 少妇人妻大乳在线视频 | 久久99热只有频精品8 | 日日天干夜夜狠狠爱 | 免费乱码人妻系列无码专区 | 欧美一区二区三区视频在线观看 | 日韩av无码中文无码电影 | 国产在线一区二区三区四区五区 | 亚洲性无码av中文字幕 | 国产精品a成v人在线播放 | 中文字幕av日韩精品一区二区 | 最新版天堂资源中文官网 | 激情爆乳一区二区三区 | 99久久久国产精品无码免费 | 国产xxx69麻豆国语对白 | 无码中文字幕色专区 | 亚洲国产精品一区二区第一页 | 少妇邻居内射在线 | 天堂无码人妻精品一区二区三区 | 一本久道久久综合狠狠爱 | 精品国产一区二区三区四区在线看 | 无码av中文字幕免费放 | av无码不卡在线观看免费 | 久久国产精品萌白酱免费 | 无码帝国www无码专区色综合 | 国产在线aaa片一区二区99 | 麻豆果冻传媒2021精品传媒一区下载 | 国产疯狂伦交大片 | 99精品国产综合久久久久五月天 | 丰满少妇女裸体bbw | 国产偷自视频区视频 | 少妇被粗大的猛进出69影院 | 精品国精品国产自在久国产87 | 日本爽爽爽爽爽爽在线观看免 | 中文字幕av无码一区二区三区电影 | 婷婷综合久久中文字幕蜜桃三电影 | 久久天天躁狠狠躁夜夜免费观看 | 国产suv精品一区二区五 | 黑人巨大精品欧美一区二区 | 亚洲综合无码一区二区三区 | 国产亚洲日韩欧美另类第八页 | 精品成人av一区二区三区 | 无码帝国www无码专区色综合 | 国产成人无码专区 | 国产亚洲精品久久久久久 | 天堂а√在线中文在线 | 亚洲精品成人福利网站 | 国产成人无码午夜视频在线观看 | 亚洲伊人久久精品影院 | 51国偷自产一区二区三区 | 中文字幕日韩精品一区二区三区 | 亚洲 激情 小说 另类 欧美 | 久久综合给合久久狠狠狠97色 | 又粗又大又硬又长又爽 | 牛和人交xxxx欧美 | 乱码av麻豆丝袜熟女系列 | 伊在人天堂亚洲香蕉精品区 | 熟女俱乐部五十路六十路av | 丁香啪啪综合成人亚洲 | 国产农村乱对白刺激视频 | 欧美xxxx黑人又粗又长 | 国产亚洲精品久久久久久久久动漫 | 亚洲午夜无码久久 | 学生妹亚洲一区二区 | 国产精品亚洲专区无码不卡 | 国产av剧情md精品麻豆 | 高潮毛片无遮挡高清免费视频 | 动漫av网站免费观看 | 国产精品高潮呻吟av久久4虎 | 亚洲一区二区三区国产精华液 | 麻豆国产丝袜白领秘书在线观看 | 午夜福利不卡在线视频 | √8天堂资源地址中文在线 | 77777熟女视频在线观看 а天堂中文在线官网 | 一本一道久久综合久久 | 成年美女黄网站色大免费全看 | 色综合久久88色综合天天 | 国产成人久久精品流白浆 | 激情五月综合色婷婷一区二区 | 天堂无码人妻精品一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 老头边吃奶边弄进去呻吟 | 亚洲呦女专区 | 熟妇激情内射com | 国产激情一区二区三区 | 欧美 日韩 人妻 高清 中文 | 欧美日韩人成综合在线播放 | 亚洲成a人片在线观看日本 | 日日噜噜噜噜夜夜爽亚洲精品 | www成人国产高清内射 | 性生交大片免费看女人按摩摩 | 色噜噜亚洲男人的天堂 | 一本加勒比波多野结衣 | 激情五月综合色婷婷一区二区 | 2020久久香蕉国产线看观看 | 久久国语露脸国产精品电影 | 成人无码精品1区2区3区免费看 | 日日天日日夜日日摸 | 欧美精品一区二区精品久久 | 又大又硬又爽免费视频 | 亚洲成熟女人毛毛耸耸多 | 亚洲午夜无码久久 | 一本色道久久综合亚洲精品不卡 | 欧美肥老太牲交大战 | 欧美freesex黑人又粗又大 | 牲欲强的熟妇农村老妇女 | 中文字幕精品av一区二区五区 | 日本熟妇浓毛 | 久久精品国产大片免费观看 | 国内少妇偷人精品视频免费 | 少妇高潮喷潮久久久影院 | 天堂а√在线地址中文在线 | 图片小说视频一区二区 | 东北女人啪啪对白 | 国产sm调教视频在线观看 | 曰韩无码二三区中文字幕 | 曰本女人与公拘交酡免费视频 | 国产无套内射久久久国产 | 国产精品无码一区二区三区不卡 | 亚洲精品国产精品乱码不卡 | 中文字幕无码热在线视频 | 澳门永久av免费网站 | 在线观看国产一区二区三区 | 天堂亚洲2017在线观看 | 纯爱无遮挡h肉动漫在线播放 | 性生交大片免费看女人按摩摩 | 色妞www精品免费视频 | 一本久道久久综合狠狠爱 | 亚洲国产精品一区二区美利坚 | 久久久久免费看成人影片 | 亚洲国产午夜精品理论片 | 亚洲一区二区观看播放 | 国精品人妻无码一区二区三区蜜柚 | 国产成人av免费观看 | 无遮挡国产高潮视频免费观看 | 国产三级久久久精品麻豆三级 | 欧美午夜特黄aaaaaa片 | 亚洲色欲久久久综合网东京热 | 丰满人妻一区二区三区免费视频 | 欧美日韩一区二区三区自拍 | 日本一卡2卡3卡四卡精品网站 | 欧美野外疯狂做受xxxx高潮 | 国产激情精品一区二区三区 | 中国女人内谢69xxxxxa片 | 99国产精品白浆在线观看免费 | 久久99精品国产.久久久久 | 亚洲精品一区国产 | 国产精品鲁鲁鲁 | 福利一区二区三区视频在线观看 | 蜜桃视频韩日免费播放 | 任你躁在线精品免费 | 亚洲国产欧美日韩精品一区二区三区 | 欧美 亚洲 国产 另类 | 亚洲 日韩 欧美 成人 在线观看 | 牲交欧美兽交欧美 | 性欧美大战久久久久久久 | www国产亚洲精品久久网站 | 蜜臀av在线播放 久久综合激激的五月天 | 精品亚洲韩国一区二区三区 | 性欧美疯狂xxxxbbbb | 99久久精品国产一区二区蜜芽 | 亚洲人成人无码网www国产 | 樱花草在线播放免费中文 | 国内精品一区二区三区不卡 | 性欧美熟妇videofreesex | 中国大陆精品视频xxxx | 无码毛片视频一区二区本码 | 国产一区二区三区四区五区加勒比 | 国产综合久久久久鬼色 | 久久国产精品精品国产色婷婷 | 日韩 欧美 动漫 国产 制服 | 国产人妻人伦精品1国产丝袜 | 欧美性猛交xxxx富婆 | 国产福利视频一区二区 | 色欲综合久久中文字幕网 | 亚洲精品午夜国产va久久成人 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲男人av天堂午夜在 | 4hu四虎永久在线观看 | 少妇的肉体aa片免费 | 在线a亚洲视频播放在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲国产精品毛片av不卡在线 | 精品国产乱码久久久久乱码 | 99久久99久久免费精品蜜桃 | 午夜福利电影 | 亚洲国产精品久久人人爱 | 一本一道久久综合久久 | 色婷婷久久一区二区三区麻豆 | a片免费视频在线观看 | 大地资源网第二页免费观看 | 久久精品一区二区三区四区 | 国产精品久久久久9999小说 | 成人精品天堂一区二区三区 | 亚洲一区二区三区播放 | 久久精品人人做人人综合 | 久久人人97超碰a片精品 | 日韩av无码中文无码电影 | 亚洲日本一区二区三区在线 | 两性色午夜免费视频 | 中文字幕av日韩精品一区二区 | 亚洲熟妇色xxxxx欧美老妇y | 人妻少妇被猛烈进入中文字幕 | 大肉大捧一进一出视频出来呀 | 天天综合网天天综合色 | 午夜嘿嘿嘿影院 | 国产亚洲精品久久久ai换 | 天天做天天爱天天爽综合网 | 夜精品a片一区二区三区无码白浆 | 日本一卡二卡不卡视频查询 | 牲欲强的熟妇农村老妇女 | 狂野欧美激情性xxxx | 日欧一片内射va在线影院 | 76少妇精品导航 | 亚洲乱码国产乱码精品精 | 国产无遮挡又黄又爽免费视频 | 亚洲高清偷拍一区二区三区 | 国产亚洲精品久久久久久 | 乌克兰少妇性做爰 | 国产后入清纯学生妹 | 性生交片免费无码看人 | 撕开奶罩揉吮奶头视频 | 波多野结衣av在线观看 | 国产精品久久久久7777 | 色婷婷av一区二区三区之红樱桃 | 搡女人真爽免费视频大全 | 亚洲色欲色欲天天天www | 精品乱子伦一区二区三区 | 天下第一社区视频www日本 | 最新国产乱人伦偷精品免费网站 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲成av人综合在线观看 | 少妇被粗大的猛进出69影院 | 99精品久久毛片a片 | 亚洲国产精品无码一区二区三区 | 中文字幕无码日韩专区 | 久久国语露脸国产精品电影 | 午夜嘿嘿嘿影院 | 久久精品中文字幕一区 | 少妇无码一区二区二三区 | 熟女少妇人妻中文字幕 | 亚洲人成人无码网www国产 | 中文字幕亚洲情99在线 | 人人妻人人澡人人爽欧美精品 | 欧美亚洲日韩国产人成在线播放 | 国产精品久免费的黄网站 | 欧洲vodafone精品性 | 亚洲精品综合一区二区三区在线 | a在线观看免费网站大全 | 三级4级全黄60分钟 | 亲嘴扒胸摸屁股激烈网站 | 熟妇激情内射com | 亚洲精品一区国产 | 久久99国产综合精品 | 午夜无码人妻av大片色欲 | 欧美国产亚洲日韩在线二区 | 动漫av一区二区在线观看 | 国产亚洲欧美日韩亚洲中文色 | 少妇性l交大片欧洲热妇乱xxx | 久久精品中文字幕一区 | 亚洲欧美中文字幕5发布 | yw尤物av无码国产在线观看 | 国产无套内射久久久国产 | 日本xxxx色视频在线观看免费 | 国产精品毛多多水多 | 波多野结衣 黑人 | 十八禁视频网站在线观看 | 欧美老妇与禽交 | 成人综合网亚洲伊人 | 丰满肥臀大屁股熟妇激情视频 | 3d动漫精品啪啪一区二区中 | 无码av免费一区二区三区试看 | 少妇性l交大片欧洲热妇乱xxx | 中文字幕av无码一区二区三区电影 | 人人妻人人澡人人爽欧美精品 | 久青草影院在线观看国产 | 大肉大捧一进一出视频出来呀 | 精品国产成人一区二区三区 | 一个人看的www免费视频在线观看 | 成 人 网 站国产免费观看 | 在线播放无码字幕亚洲 | 中文字幕人成乱码熟女app | 中文字幕+乱码+中文字幕一区 | 国产精品va在线播放 | 精品水蜜桃久久久久久久 | 欧美freesex黑人又粗又大 | 国产精品亚洲综合色区韩国 | 国产精品亚洲五月天高清 | 九九综合va免费看 | 久久精品国产亚洲精品 | 午夜男女很黄的视频 | 丰满人妻翻云覆雨呻吟视频 | 在线播放免费人成毛片乱码 | 免费播放一区二区三区 | 国产又爽又猛又粗的视频a片 | 精品午夜福利在线观看 | 激情内射日本一区二区三区 | 亚洲国产午夜精品理论片 | 久久久久人妻一区精品色欧美 | 纯爱无遮挡h肉动漫在线播放 | 久久精品女人的天堂av | 国产精品久久久 | 婷婷丁香六月激情综合啪 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产精品久久久一区二区三区 | 亚洲国产欧美国产综合一区 | 强开小婷嫩苞又嫩又紧视频 | 人人爽人人澡人人人妻 | 熟妇人妻无乱码中文字幕 | а√天堂www在线天堂小说 | 久久精品丝袜高跟鞋 | 中文字幕乱妇无码av在线 | 国产高清不卡无码视频 | 亚洲精品久久久久久一区二区 | 国产 浪潮av性色四虎 | 十八禁真人啪啪免费网站 | 天堂在线观看www | 久久zyz资源站无码中文动漫 | 国产 浪潮av性色四虎 | 国内精品人妻无码久久久影院蜜桃 | 中国女人内谢69xxxx | 人人妻人人藻人人爽欧美一区 | 精品无码一区二区三区爱欲 | 亚洲精品国产第一综合99久久 | √天堂中文官网8在线 | 精品亚洲成av人在线观看 | 亚洲色成人中文字幕网站 | 亚洲精品久久久久avwww潮水 | 俺去俺来也在线www色官网 | 久久亚洲中文字幕无码 | 国产熟妇另类久久久久 | 无遮挡国产高潮视频免费观看 | 无码人妻精品一区二区三区不卡 | 久久五月精品中文字幕 | 中文字幕人妻无码一夲道 | 日韩欧美中文字幕公布 | 色 综合 欧美 亚洲 国产 | 激情亚洲一区国产精品 | 麻豆av传媒蜜桃天美传媒 | 中国女人内谢69xxxxxa片 | 久久精品国产99久久6动漫 | 国产成人精品一区二区在线小狼 | 国产xxx69麻豆国语对白 | 天天摸天天透天天添 | 狠狠亚洲超碰狼人久久 | 一个人免费观看的www视频 | 国产精品高潮呻吟av久久 | 99久久精品午夜一区二区 | 丰满人妻一区二区三区免费视频 | 美女极度色诱视频国产 | 欧美喷潮久久久xxxxx | 国产精品久久久久9999小说 | 久久精品国产亚洲精品 | 国产精品鲁鲁鲁 | 国产精品欧美成人 | 国产无遮挡吃胸膜奶免费看 | 国产免费无码一区二区视频 | 人人妻人人澡人人爽欧美一区九九 | 中文字幕无码免费久久9一区9 | 九九综合va免费看 | 一区二区三区乱码在线 | 欧洲 | 福利一区二区三区视频在线观看 | 亚洲日本一区二区三区在线 | 人妻中文无码久热丝袜 | 九九在线中文字幕无码 | 国产麻豆精品一区二区三区v视界 | 精品国产乱码久久久久乱码 | 中文无码精品a∨在线观看不卡 | 亚洲欧洲日本无在线码 | 国产色精品久久人妻 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲精品www久久久 | 亚洲一区av无码专区在线观看 | 日韩精品无码一本二本三本色 | 亚洲 欧美 激情 小说 另类 | 东北女人啪啪对白 | 久久国内精品自在自线 | 亚洲中文字幕无码中文字在线 | 国产av一区二区精品久久凹凸 | 99er热精品视频 | 麻豆av传媒蜜桃天美传媒 | 免费国产黄网站在线观看 | 99视频精品全部免费免费观看 | 波多野结衣av一区二区全免费观看 | 国产肉丝袜在线观看 | 精品国偷自产在线视频 | 亚洲经典千人经典日产 | 樱花草在线社区www |