日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ primer第六章函数的学习

發(fā)布時(shí)間:2023/12/13 c/c++ 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ primer第六章函数的学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

  • 首先介紹函數(shù)的定義和聲明,包括如何傳入?yún)?shù)以及函數(shù)如何返回結(jié)果。
  • C++語(yǔ)言允許使用重載函數(shù),即幾個(gè)不同的函數(shù)可以使用向同一個(gè)名字。所以接下來(lái)介紹重載函數(shù)的方法,以及編譯器選擇如何從函數(shù)的若干重載的形式中選取一個(gè)與調(diào)用模板相互匹配的版本進(jìn)行使用。
  • 最后介紹一些關(guān)于函數(shù)指針的知識(shí)。

6.1 函數(shù)的基礎(chǔ)

  • 一個(gè)函數(shù)的定義包括以下幾個(gè)部分:返回類型、函數(shù)的名字、0或者多個(gè)形參組成的列表或者函數(shù)體。
  • 形參以逗號(hào)分隔,形參列表位于一對(duì)圓括號(hào)里面。
  • 函數(shù)具體實(shí)現(xiàn)的代碼寫在一對(duì)花括號(hào)里面,整體稱之為函數(shù)體。

編寫函數(shù)

  • 寫一個(gè)求階乘的函數(shù)
#include<iostream> using namespace std;int fact(int val){int rel = 1;for(int i = val;i != 0;i--){rel *= i;}return rel; }int main(){cout << "The result of rel is "<< fact(5) << endl;return 0; }

調(diào)用函數(shù)

  • 調(diào)用函數(shù)主要完成兩項(xiàng)工作:1,實(shí)參初始化函數(shù)對(duì)應(yīng)的形參;2,將控制權(quán)交給調(diào)用函數(shù),這個(gè)時(shí)候,被調(diào)的函數(shù)開始執(zhí)行。

形參和實(shí)參

  • 實(shí)參數(shù)量和形參數(shù)量、類型一致
  • 如果定義沒(méi)有參數(shù)的函數(shù),使用void關(guān)鍵字void f1();// 隱式定義空的形參列表? ? void f2(void); //顯式定義空的形參列表
  • 任意兩個(gè)形參不可以同名,而且函數(shù)最外層作用域中的變量也不可以和形參同名。

函數(shù)的返回類型

  • 一種特殊的返回類型是void
  • 函數(shù)的返回類型不可以是數(shù)組或函數(shù)類型,但可以是指向函數(shù)或者數(shù)組的指針。

6.1.1 局部對(duì)象

  • 形參和函數(shù)體內(nèi)部定義的變量統(tǒng)一稱為局部變量,對(duì)于函數(shù)而言是局部的、是隱藏的。
  • 函數(shù)執(zhí)行的時(shí)候創(chuàng)建,函數(shù)執(zhí)行結(jié)束的時(shí)候會(huì)銷毀的變量叫做自動(dòng)對(duì)象。
  • 對(duì)于局部變量對(duì)應(yīng)的自動(dòng)對(duì)象來(lái)說(shuō),如果變量本身含有初始化的數(shù)值,就采用初始化的數(shù)值,否則就采用默認(rèn)的初始化的值。

局部靜態(tài)對(duì)象

  • 將局部變量定義成static的類型,這種使用static類型修飾的變量,只會(huì)在程序第一次進(jìn)入的時(shí)候進(jìn)行初始化,直到程序的終止才會(huì)銷毀,在此期間,即使對(duì)象所在的函數(shù)結(jié)束也不會(huì)對(duì)它有任何的影響。

6.1.2 函數(shù)聲明

  • 函數(shù)聲明不需要函數(shù)體,也就是無(wú)需形參的名字。
  • 函數(shù)的三個(gè)要素(返回類型、函數(shù)名字、形參類型)描述了函數(shù)的接口,說(shuō)明了調(diào)用這個(gè)函數(shù)的
  • 一般將函數(shù)的聲明放在頭文件中,就可以確保同一函數(shù)的聲明保持一致,一旦想要改變函數(shù)的接口,只需要改變一條聲明語(yǔ)句即可。
  • 定義函數(shù)的源文件應(yīng)該包含所有函數(shù)聲明的頭文件,這樣編譯器就會(huì)負(fù)責(zé)驗(yàn)證函數(shù)的定義和聲明是否匹配

6.1.3 分離式編譯

  • 將程序拆分成不同的部分分別存儲(chǔ),分離式編譯器允許將程序分割到幾個(gè)文件中,對(duì)于每個(gè)文件進(jìn)行獨(dú)立編譯。

編譯和鏈接多個(gè)源文件

  • 頭文件 存放函數(shù)的聲明
  • 源碼文件 存放函數(shù)的具體實(shí)現(xiàn)的代碼
  • 主函數(shù) 調(diào)用函數(shù)的具體執(zhí)行,需要引入頭文件

例子

  • 源文件 factCC.cpp
int fact(int val){int rel = 1;for(int i = val;i != 0;i--){rel *= i;}return rel; }
  • 頭文件 factHead.h
int fact(int val);
  • main函數(shù)
#include<iostream> #include "factHead.h" using namespace std;int main(){cout << "The result is " << fact(5) << endl;return 0; }

6.2 參數(shù)傳遞

  • 每次調(diào)用函數(shù)的時(shí)候,都會(huì)重新創(chuàng)建它的形參,并用傳入的實(shí)參進(jìn)行初始化
  • 和其他變量一樣,形參的類型決定了形參和實(shí)參的交互方式。如果形參是引用類型,它將綁定到對(duì)應(yīng)的實(shí)參上;否則,將實(shí)參的數(shù)值拷貝后賦值給形參。
  • 當(dāng)形參是引用類型時(shí),它對(duì)應(yīng)的實(shí)參被引用傳遞或者函數(shù)被傳引用調(diào)用。和其他引用一樣,引用形參也是它綁定的對(duì)象的別名,即引用形參是他對(duì)應(yīng)的實(shí)參的別名。
  • 當(dāng)實(shí)參的數(shù)值被拷貝給形參的時(shí)候,形參和實(shí)參是兩個(gè)相互獨(dú)立的對(duì)象。這樣的實(shí)參被值傳遞或者函數(shù)被傳值調(diào)用。

6.2.1 傳值參數(shù)

  • 當(dāng)初始化一個(gè)非引用類型的變量時(shí),初始值被拷貝給變量,此時(shí)對(duì)于變量的改動(dòng)不會(huì)影響初始值。
int n = 0;//int類型的初始變量 int i = n;//i是n的副本 i = 42;// 對(duì)于i的改變不會(huì)影響到n的數(shù)值

指針形參

  • 指針的行為和其他非引用的類型一致。執(zhí)行指針拷貝操作的時(shí)候,拷貝的是指針的數(shù)值。拷貝之后,兩個(gè)指針是不同的指針。因?yàn)橹羔樖刮覀兛梢蚤g接地訪問(wèn)它所指的對(duì)象,所以通過(guò)指針可以修改它所指的對(duì)象的數(shù)值。
int main(){int n=0,i=42;int *p = &n,*q = &i;//p指向n,q指向i*p = 44;//n的數(shù)值改變,p不變p=q;//p現(xiàn)在指向i了,但是i和n的數(shù)值都不變cout << "The n result is " << n << endl; //44cout << "The i result is " << i << endl; //42cout << "The p result is " << *p << endl;//42cout << "The q result is " << *q << endl;//42return 0; } //該函數(shù)接受一個(gè)指針,然后將只針?biāo)赶虻奈恢迷O(shè)為0 void reset(int *ip){*ip = 0;// 改變了指針ip所指向的數(shù)值ip = 0;//只改變了ip的局部拷貝,實(shí)參未被改變 } int main(){int i = 42;reset(&i);cout << "i = " << i << endl;return 0; }
  • C++建議使用引用類型的形參替代指針

6.2.2 傳引用參數(shù)

  • 對(duì)于引用的操作實(shí)際上是作用在引用所引的對(duì)象上。
int main(){int n = 0,i=42;int &r = n; //r綁定了n,r是n的另外一個(gè)名字r = 42; //改變了n的數(shù)值,n也是42cout << "n = " << n << endl;//42cout << "r = " << r << endl;//42return 0; } //該函數(shù)接受一個(gè)int對(duì)象的引用,然后將對(duì)象的數(shù)值設(shè)為0 void reset(int &i){//i是傳給函數(shù)對(duì)象的另外一個(gè)名字i = 0;//改變了i所引對(duì)象的數(shù)值 }int main(){int j = 42;reset(j);cout << "j = " << j << endl;//42return 0; }
  • 和其他引用的類型一致,引用形參綁定初始化他的對(duì)象。當(dāng)調(diào)用reset函數(shù)的時(shí),i就會(huì)綁定我們傳給函數(shù)的int對(duì)象,改變i的數(shù)值也就是改變i引用的數(shù)值。

使用引用避免拷貝

  • 拷貝大的類類型對(duì)象或者容器對(duì)象比較低效,甚至有的類類型就根本不支持拷貝操作。當(dāng)某種類型不支持拷貝操作時(shí),函數(shù)只能通過(guò)引用形參來(lái)訪問(wèn)該類型的對(duì)象。
  • 比如一個(gè)比較兩個(gè)字符串大小的函數(shù),考慮到字符串都比較長(zhǎng),就要避免直接拷貝他們,這個(gè)時(shí)候使用引用形參就是比較明智的選擇,因?yàn)楸容^長(zhǎng)度無(wú)法改變string對(duì)象的內(nèi)容,所以把形參定義成對(duì)于常量的引用。
bool isShorter(const string &s1,const string &s2){return s1.size() < s2.size(); }

使用形參返回額外的信息

  • 使用形參可以一次返回多個(gè)結(jié)果提供了有效的途徑。
  • 例子:函數(shù)返回在string中某個(gè)字符第一次出現(xiàn)的位置以及該字符總共出現(xiàn)的次數(shù)
  • 如何使函數(shù)既可以返回位置也返回出現(xiàn)的次數(shù)呢?一種方法是定義一個(gè)新的數(shù)據(jù)類型,讓他包含位置和次數(shù)兩個(gè)成員;另外一種方法是給函數(shù)傳入一個(gè)額外的引用實(shí)參,另其保存字符出現(xiàn)的次數(shù)
//返回s中c第一次出現(xiàn)的位置索引 //引用形參occurs負(fù)責(zé)統(tǒng)計(jì)c出現(xiàn)的總的次數(shù) string::size_type find_char(const string &s,char c,string::size_type &occurs){auto ret = s.size();//第一次出現(xiàn)的位置(如果存在的話)occurs = 0;for(decltype(ret) i = 0;i!= s.size();i++){if(s[i] == c){if(ret == s.size()){ret = i;}++ occurs;}}return ret; }bool isShorter(const string &s1,const string &s2){return s1.size() < s2.size(); } int main(){string s1 = "HelloWorld";string s2 = "Hello";string::size_type ctr;auto index = find_char(s1,'o',ctr);cout << "index = " << index << " ctr = " << ctr << endl;bool s3 = isShorter(s2,s1);cout << "" << s3 << endl;return 0; }
  • 其中,給ret賦值為最大長(zhǎng)度的目的是為了在后面判斷的時(shí)候,查看是否改變,從而確定是不是第一次遇到這個(gè)數(shù)值,可以將大于數(shù)組長(zhǎng)度的任意值作為判定的條件。

6.2.3 const形參和實(shí)參

  • 當(dāng)形參是const的時(shí)候,頂層的const作用于對(duì)象的本身。
const int ci = 42; // 不能改變ci,const是頂層的int i = ci; // 正確,當(dāng)拷貝ci的時(shí)候,會(huì)忽略他的頂層的數(shù)值int * const p = &i;//const是頂層的,不可以給p賦值*p = 0;//正確,通過(guò)p改變對(duì)象的的內(nèi)容是允許的,現(xiàn)在i的數(shù)值變?yōu)榱?
  • 和其他初始值一樣,當(dāng)使用實(shí)參初始化形參的時(shí)候會(huì)忽略掉頂層的const。即,形參的頂層const被忽略掉了。
  • 當(dāng)形參有頂層的const的時(shí)候,傳給他的常量對(duì)象或者非常量對(duì)象都是可以的。
  • void fun(const int i)//fun可以能夠讀取i,但是不可以向i中寫值
  • void fun(const int i)//錯(cuò)誤,重復(fù)定義了fun(int) C++允許定義若干具有相同的名字的函數(shù),前提是不同函數(shù)的形參列表應(yīng)該有明確的區(qū)別。此處是因?yàn)閏onst被忽略掉了,因IC兩個(gè)函數(shù)沒(méi)有任何的區(qū)別,不可以重復(fù)的定義。

指針或者引用形參與const

  • 形參的初始化和變量的初始化的方式是一樣的。我們可以使用非常量初始化一個(gè)底層的const對(duì)象,但是反過(guò)來(lái)不可以,同時(shí)一個(gè)普通的引用必須使用相同類型的對(duì)象初始化。
int i = 42;const int *cp = &i; //正確,cp不能改變i,const是頂層的const int &r = i; //正確,r不能改變i,const是頂層的const int *r2 = &i; //正確,r2不能改變i,const是頂層的int *p = cp;//錯(cuò)誤,類型不符int &r3 = r;//錯(cuò)誤,類型不符int &r4 = 42;//錯(cuò)誤,不能用字面值初始化一個(gè)非常量的引用
  • 將同樣的規(guī)則使用在參數(shù)傳遞上

盡量使用常量引用

  • 把函數(shù)不會(huì)改變的形參定義成(普通的)引用是一種常見的錯(cuò)誤,這么做會(huì)給調(diào)用者一種誤導(dǎo),即函數(shù)不會(huì)改變它的實(shí)參的數(shù)值。使用引用而非常量引用也會(huì)極大地限制函數(shù)所能接受的實(shí)參類型。
  • 不能把const對(duì)象、字面值或者需要類型轉(zhuǎn)換的對(duì)象傳遞給普通的引用形參。這種錯(cuò)誤很難排解
  • 這個(gè)是上面提到的代碼,對(duì)其進(jìn)行修改string::size_type find_char(const string &s,char c,string::size_type &occurs),改為string::size_type find_char(const string &s,char c,string::size_type &occurs),將string類型的形參定義成常量引用。假如將其定義成普通的string&,沒(méi)有const進(jìn)行修飾。那么在使用的時(shí)候只可以auto index = find_char(“Hello ”,'o',ctr);,編譯會(huì)發(fā)生錯(cuò)誤。
  • 假如其他函數(shù)將他們的形參定義成常量的引用,那么第二個(gè)版本的函數(shù)無(wú)法在此類函數(shù)上正常使用。假設(shè)在一個(gè)判斷string對(duì)象是否是句子的函數(shù)中使用find_char;
bool is_sentsence(const string &s){//如果s的末尾有一個(gè)句號(hào)且僅有一個(gè),則是句子string::size_type ctr = 0;return find_char(s,'.',ctr) == s.size()-1 && ctr == 1; }
  • 如果find_char()第一個(gè)形參類型是string & ,那么會(huì)發(fā)生編譯錯(cuò)誤,是因?yàn)閟是常量的引用,但是函數(shù)find_char被定義成可以只能接受普通引用。如果修改is_sentsence函數(shù)的形參類型只會(huì)轉(zhuǎn)移錯(cuò)誤,使得is_sentsence函數(shù)只可以接受非常量的string對(duì)象。
  • 正確的思路是改變find_char的函數(shù)的形參。實(shí)在不行才修改is_sentsence函數(shù),在其內(nèi)部定義一個(gè)string類型的變量,另其為s的副本,然后把這個(gè)string對(duì)象傳遞給find_char()。

6.2.4 數(shù)組形參

  • 數(shù)組的兩個(gè)特殊的性質(zhì)使得我們定義和使用作用在數(shù)組上的函數(shù)有影響,這兩個(gè)性質(zhì)是:1,不允許拷貝數(shù)組;2,使用數(shù)組的時(shí)候通常要將其轉(zhuǎn)換為指針,所以當(dāng)為函數(shù)傳遞一個(gè)數(shù)組的時(shí)候,實(shí)際上傳遞的是指向數(shù)組首元素的指針。
  • 雖然不能以數(shù)值的方式傳遞數(shù)組,但是可以形參寫成類似數(shù)組的形式。
//盡管形式不同,但是這三個(gè)print的函數(shù)是等價(jià)的//每個(gè)函數(shù)都會(huì)有一個(gè)const int*類型的形參void print(const int *);void print(const int[]); //函數(shù)的意圖是作用于一個(gè)數(shù)組void print(const int[10]); //這里的維度表示我們期望數(shù)組會(huì)含有多少個(gè)元素,實(shí)際上不一定//盡管表現(xiàn)形式不同,但是上面這三個(gè)函數(shù)是等價(jià)的,每個(gè)函數(shù)的唯一形參都是const int *類型的//當(dāng)編譯器處理對(duì)print函數(shù)的調(diào)用的時(shí)候,只會(huì)檢查傳入的參數(shù)是否是const int *類型的int i = 0,j[2] = {0,1};print(&i); //正確,&i的類型是int *print(j); //正確,j轉(zhuǎn)化成int *并且指向j[0]return 0;
  • 如果傳遞給print函數(shù)是一個(gè)數(shù)組,則實(shí)參自動(dòng)轉(zhuǎn)化成指向數(shù)組首元素的指針,數(shù)組的大小對(duì)于函數(shù)的調(diào)用沒(méi)有關(guān)系,但是在使用數(shù)組的時(shí)候需要注意到數(shù)組越界的問(wèn)題。

使用標(biāo)記指定數(shù)組的長(zhǎng)度

  • 要求數(shù)組本身?yè)碛幸粋€(gè)結(jié)束的標(biāo)記,典型問(wèn)題是C風(fēng)格的字符串中,在字符后面跟著一個(gè)空的字符。
void print(const char *cp){if(cp) //如果cp不是一個(gè)空的指針while(*cp) //只要指針指向的字符不是空的字符串cout << *cp++ ; //輸出當(dāng)前字符的數(shù)值,并將指針向前移動(dòng)一個(gè)位置 } int main(){char s[] = "Hello World!";print(s);return 0; }
  • 這種方法適用于那些有著明顯的結(jié)束標(biāo)記,但是該標(biāo)記不會(huì)與普通的數(shù)據(jù)相互混淆的情形,但是不適用于所有的取值都是合法的情形。

使用標(biāo)準(zhǔn)庫(kù)規(guī)范

  • 管理數(shù)組實(shí)參的第二種方法是傳遞指向數(shù)組首元素和尾后元素的指針
void print(const char *beg,const char *end){//輸出beg到end之間(不包含end)的所有元素while (beg != end){cout << *beg++;} }int main(){char s[] = "Hello";print(begin(s),end(s));return 0; }
  • while循環(huán)使用解引用運(yùn)算符和后置遞減運(yùn)算符輸出當(dāng)前元素并且在數(shù)組內(nèi)將beg向前移動(dòng)一個(gè)元素,當(dāng)beg和end指針相等的時(shí)候結(jié)束循環(huán)
  • 為了調(diào)用這個(gè)函數(shù),需要傳入兩個(gè)指針,一個(gè)指向要輸出的首元素,一個(gè)指向尾元素的下一個(gè)位置。具體的調(diào)用方法如上圖所示。此處使用bigin和end函數(shù)提供所需的地址。

顯式傳遞一個(gè)表示數(shù)組大小的形參

  • 第三種管理數(shù)組實(shí)參的方法是專門定義一個(gè)表示數(shù)組大小的形參,在C程序和過(guò)去的C++程序中常常使用這種方法。
//const int ia[] 等效于const int* ia //size表示數(shù)組的大小,將它顯式地傳遞給函數(shù)用于控制對(duì)ia元素的訪問(wèn) void print(const int ia[],size_t size){for(size_t i = 0;i != size;i++){cout << ia[i] << endl;} } int main(){int j[] = {0,1,2,3,4,5,6,7,8,9};print(j,end(j) - begin(j));return 0; }

數(shù)組形參和const

  • 前三個(gè)函數(shù)都將數(shù)組的形參定義成指向const的指針,對(duì)于引用類型也同樣適用于指針。當(dāng)函數(shù)不需要對(duì)于數(shù)組元素執(zhí)行寫操作的時(shí)候,數(shù)組的形參應(yīng)該是指向const的指針。只有當(dāng)函數(shù)確實(shí)要改變?cè)財(cái)?shù)值的時(shí)候,才會(huì)把形參定義成指向常量的指針。

數(shù)組引用形參

  • C++允許將變量定義成數(shù)組的引用,基于同樣的道理,形參也是數(shù)組的引用。這個(gè)時(shí)候,引用形參綁定到對(duì)應(yīng)的實(shí)參上,也就是綁定到數(shù)組上。
//正確,形參是數(shù)組的引用,維度是類型的一部分 void print(int (&arr)[10]){for(auto elem : arr){cout << elem << endl;} }
  • 因?yàn)閿?shù)組的大小是構(gòu)成數(shù)組類型的一部分,所以只要不超過(guò)維度,在函數(shù)體內(nèi)就可以放心的使用數(shù)組。
  • 但是,如果采用上面的代碼格式就會(huì)限制了print函數(shù)的可用性,即只能將函數(shù)作用于大小是10的數(shù)值。

注意事項(xiàng)?

  • &arr的兩端的括號(hào)必不可少
  • f(int &arr[10]) //錯(cuò)誤,將arr聲明成了引用類型
  • f(int (&arr)[10]) //正確,arr是具有10個(gè)整數(shù)的整型數(shù)組的引用

傳遞多維數(shù)組

  • C++實(shí)際上并沒(méi)有多維數(shù)組,所謂的所謂數(shù)組其實(shí)是數(shù)組的數(shù)組。
  • 和所有數(shù)組一樣,當(dāng)將多維數(shù)組傳遞給函數(shù)的時(shí)候,真正傳遞的是指向數(shù)組首個(gè)元素的指針。因?yàn)槎嗑S數(shù)組就是數(shù)組的數(shù)組,因此首元素就是一個(gè)數(shù)組,指針是一個(gè)指向數(shù)組的指針。數(shù)組的第二維度以及后面所有的維度的大小都是數(shù)組類型的一部分,不可以忽略。
//matrix指向數(shù)組的首個(gè)元素,該數(shù)組的元素是由10個(gè)整數(shù)構(gòu)成的數(shù)組void print(int (*matrix)[10],int rowSize){}
  • 上面的語(yǔ)句是將matrix聲明成指向10個(gè)整數(shù)的數(shù)組的指針。
//再一次強(qiáng)調(diào),*matrix兩端的括號(hào)必不可少int *matrix[10]; //10個(gè)指針構(gòu)成的數(shù)組int (*matrix)[10]; //指向含有10個(gè)整數(shù)的數(shù)組的指針
  • 也可以使用數(shù)組的語(yǔ)法定義函數(shù),此時(shí)編譯器會(huì)一如既往地忽略掉第一個(gè)維度,所以最好不要把它包括在形參的列表內(nèi),所以最好不要把它包括在形參列表內(nèi)。
  • //等價(jià)定義 void print(int matrix[][10] , int rowSize){}
  • matrix的聲明看起來(lái)是一個(gè)二維數(shù)組,實(shí)際上形參是指向含有10個(gè)整數(shù)的數(shù)組的指針。

6.2.5 main 處理命令行選項(xiàng)

  • main函數(shù)是演示C++程序如何向函數(shù)傳遞數(shù)組的好例子。到目前為止,使用的是main函數(shù)都是只有空的形參列表的形式。比如int main(){}
  • 有時(shí)候確實(shí)需要給main函數(shù)傳遞實(shí)參,一種常見的情況下是用戶通過(guò)設(shè)置一組選項(xiàng)來(lái)確定函數(shù)所要執(zhí)行的操作。
  • 例如,假定main函數(shù)位于執(zhí)行prog之內(nèi),我們可以向程序傳遞下面的選項(xiàng)。
  • prog -d -o ofile data0? ?這些命令的選項(xiàng)通過(guò)兩個(gè)可以選擇的形參傳遞給main函數(shù)
  • int main (int argc, char *argv[]){? ?}
  • 第二個(gè)形參argv是一個(gè)數(shù)組,他的元素是指向C風(fēng)格的字符串的指針,第一個(gè)形參argc表示數(shù)組中字符串的數(shù)量。因?yàn)?#xff0c;第二個(gè)形參是數(shù)組,所以main函數(shù)也可以定義成
  • int main(int argc,char **argv[]){? ? },其中argv指向char *
  • 當(dāng)形參傳給main函數(shù)之后,argv的第一個(gè)元素指向程序的名字或者一個(gè)空的字符串,接下來(lái)的元素依次傳遞命令行提供的實(shí)參。最后一個(gè)指針之后的元素?cái)?shù)值保證為0。
  • 當(dāng)使用arrgv中的實(shí)參時(shí),一定要記得可選的實(shí)參從arrgv【1】開始,arrgv[0]保存程序的名字,并非用戶的輸入

6.2.6 含有可變形參的函數(shù)

  • 一般使用在無(wú)法提前預(yù)知向函數(shù)傳遞幾個(gè)實(shí)參的情形。
  • 為了處理不同數(shù)量實(shí)參的函數(shù),C++11提供了兩個(gè)主要的方法:1,如果所有的類型都相同,可以傳遞一個(gè)名為initializer_list的標(biāo)準(zhǔn)庫(kù)類型;2,如果實(shí)參的類型不同,可以編寫一個(gè)特殊的函數(shù),也就是所謂的可變參數(shù)模板。
  • C++還有一種特殊的形參類型,即省略符號(hào),可以用它傳遞可變數(shù)量的實(shí)參。介紹的省略符形參一般只適用于與C函數(shù)交互的接口程序。

initializer_list形參

  • 適用于函數(shù)的實(shí)參數(shù)量未知但是全部的實(shí)參類型是一致的情形。
  • initializer_list是一種標(biāo)準(zhǔn)庫(kù)類型,用于表示某種特定類型的數(shù)值和數(shù)組,其定義在同名的頭文件中。
initializer_list<T>lst; //默認(rèn)初始化,T類型元素的空的列表initializer_list<T>lst{a,b,c...}; //list元素的數(shù)量和初始值一樣多,lst的元素是對(duì)應(yīng)初始值的副本;列表中的元素是constlst2(lst); //拷貝或者賦值一個(gè)initializer_list對(duì)象不會(huì)拷貝列表中的元素,拷貝之后原始列表和副本共享元素lst.size();//類表中元素的數(shù)量lst.begin();//返回指向lst中首元素的指針lst.end();//返回指向lst中尾元素下一個(gè)未知的指針
  • initializer_list和vector一樣,也是一種模板類型,定義initializer_list的時(shí)候也必須說(shuō)明列表中所包含元素的類型
  • initializer_list<string> ls;? //initializer_list的元素類型是string
  • initializer_list<int> li;? ? //initializer_list的元素類型是int
  • initializer_list中的元素永遠(yuǎn)是常量,這一點(diǎn)不同于vector,因此無(wú)法改變initializer_list對(duì)象中元素的數(shù)值。
  • 使用如下代碼就可以編寫輸出錯(cuò)誤信息的函數(shù),使其作用于可以改變的數(shù)量的實(shí)參。
void error_msg(initializer_list<string> il){for(auto beg = il.begin();beg != il.end();++beg){cout << *beg << " "<< endl;} }
  • 如果想向initializer_list形參中傳遞一個(gè)數(shù)值的序列,則必須將序列放在一對(duì)花括號(hào)內(nèi)。

省略符形參

  • 省略符形參是為了C++程序訪問(wèn)特定的C代碼而設(shè)置的,這些代碼使用了名為varargs的C的標(biāo)準(zhǔn)庫(kù)的功能。
  • 通常省略形參不應(yīng)該用于其他的目的。
  • 省略形參應(yīng)該用于C和C++通用的類型,但是值得注意的是,大多數(shù)的類類型的對(duì)象在傳遞給省略符形參的時(shí)候都無(wú)法正確的拷貝。
  • 省略形參只能出現(xiàn)在形參列表的最后一個(gè)位置,形式無(wú)外乎兩種
  • void foo(parm_list,...);指定了foo函數(shù)的部分形參的類型,對(duì)應(yīng)于這些形參的實(shí)參將會(huì)執(zhí)行正常的類型檢查,形參后面的逗號(hào)是可以選擇的。
  • void foo(...);? 省略符形參所對(duì)應(yīng)的實(shí)參不需要類型的檢查

6.3 返回類型和return語(yǔ)句

  • return語(yǔ)句終止當(dāng)前正在執(zhí)行的函數(shù)并將控制權(quán)返回到該函數(shù)被調(diào)用的地方。
  • 兩種形式:return ; 和 return expression;

6.3.1 無(wú)返回值函數(shù)

  • 沒(méi)有返回值的return語(yǔ)句只能用于返回類型是void的函數(shù)中。返回void的函數(shù)不需要非得有return語(yǔ)句,因?yàn)樵谠擃惡瘮?shù)的最后一句會(huì)隱式執(zhí)行return。
  • 通常情況下,void函數(shù)如果想在他的中間位置退出,可以使用return語(yǔ)句,這個(gè)用法類似break。
  • 例如:寫一個(gè)swap函數(shù),使其在參與交換的數(shù)值相等的時(shí)候,什么也不做,直接退出
void swap(int &v1,int &v2){if(v1 == v2){return ;}int tmp = v2;v2 = v1;v1 = tmp; } int main(){int s1 = 1;int s2 = 1;swap(s1,s2);return 0; }
  • 一個(gè)返回類型是void的函數(shù)也可以使用return的第二種形式,不過(guò)此時(shí)return語(yǔ)句的expression必須是另外一個(gè)void的函數(shù)。強(qiáng)行令void函數(shù)返回其他類型的表達(dá)式將產(chǎn)生編譯錯(cuò)誤。

6.3.2 有返回值的函數(shù)

  • 只要函數(shù)的返回類型不是void,那么函數(shù)內(nèi)部的每一個(gè)return語(yǔ)句必須返回一個(gè)數(shù)值。
  • return的返回類型必須和函數(shù)的返回類型相互一致,或者隱式轉(zhuǎn)換成函數(shù)的返回類型
  • 在含有return語(yǔ)句的循環(huán)后面的應(yīng)該也有一條return語(yǔ)句,如果沒(méi)有的話該程序是錯(cuò)誤的,很多編譯器都無(wú)法發(fā)現(xiàn)這個(gè)錯(cuò)誤

值是如何返回的

  • 數(shù)值的返回和初始化一個(gè)變量或者形參的方式是完全一樣的,返回的數(shù)值用于初始化調(diào)用點(diǎn)的一個(gè)臨時(shí)變量,該臨時(shí)變量就是函數(shù)調(diào)用的結(jié)果。
  • 必須注意函數(shù)返回局部變量時(shí)的初始化規(guī)則。
  • 例子:給定計(jì)數(shù)值、單詞和結(jié)束符之后,判斷計(jì)數(shù)值是否大于1,是的話,返回單詞的復(fù)數(shù);否的話,返回單詞的原型
//如果str的數(shù)值大于1,返回word的復(fù)數(shù)的形式 string make_plural(size_t ctr, const string &word, char ending){return (ctr > 1) ? word + ending : word; } int main(){string s1 = "Hello Hello string world";cout << make_plural(2,s1,'s') ;return 0; }
  • 這個(gè)函數(shù)返回的類型是string,意味著返回值將會(huì)被拷貝到調(diào)用點(diǎn)。因此,該函數(shù)將會(huì)返回一個(gè)word的副本或者一個(gè)未命名的臨時(shí)的string對(duì)象,該對(duì)象是word和string的和。
  • 同其他引用的類型一樣,如果函數(shù)返回引用,則該引用僅僅是它所引用對(duì)象的一個(gè)別名。
  • 例子:函數(shù)返回兩個(gè)string中形參較短的那個(gè)并且返回其引用,其中形參和返回類型都是const string的引用,不管是調(diào)用函數(shù)還是返回的結(jié)果都不會(huì)真正的拷貝string對(duì)象。
//跳出兩個(gè)string對(duì)象中較短的那個(gè),并且返回其引用 const string &shorterString(const string &s1,const string &s2){return s1.size() < s2.size() ? s1 : s2; } int main(){string s1 = "Hello Hello string world";string s2 = "Hello Hello";cout << shorterString(s1,s2) ;return 0; }

不要返回局部對(duì)象的引用或者指針

  • 函數(shù)執(zhí)行完畢之后,會(huì)釋放掉占用的存儲(chǔ)空間,因此函數(shù)的終止意味著將局部變量的引用指向不再有效的內(nèi)存區(qū)域。
  • 錯(cuò)誤的原因在于試圖訪問(wèn)未定義的變量
  • 返回局部對(duì)象的指針也是錯(cuò)誤的,函數(shù)完成,局部對(duì)象釋放,指針將會(huì)指向一個(gè)不再可用的內(nèi)存空間
//嚴(yán)重錯(cuò)誤:這個(gè)函數(shù)試圖返回局部對(duì)象的引用 cosnt string &manip(){string ret;//通過(guò)某種凡是改變一下retif(!ret.empty()){return ret;//錯(cuò)誤,返回的是一個(gè)對(duì)于局部變量的引用}else{return "Empty!";//錯(cuò)誤:"Empty是一個(gè)局部臨時(shí)的變量"} }

返回類類型函數(shù)和調(diào)用運(yùn)算符

  • 調(diào)用運(yùn)算符存在優(yōu)先級(jí)和結(jié)合律,其優(yōu)先級(jí)和點(diǎn)運(yùn)算符號(hào)和箭頭運(yùn)算符號(hào)等同,并且也符合左結(jié)合律。
  • 如果函數(shù)返回的指針、引用或者類對(duì)象,就可以通過(guò)函數(shù)調(diào)用的結(jié)果來(lái)訪問(wèn)結(jié)果對(duì)象的成員。
  • 例如,通過(guò)如下的形式得到較短的string對(duì)象的長(zhǎng)度(這個(gè)例子相當(dāng)于調(diào)用對(duì)象的子函數(shù))
//跳出兩個(gè)string對(duì)象中較短的那個(gè),并且返回其引用 const string &shorterString(const string &s1,const string &s2){return s1.size() < s2.size() ? s1 : s2; }int main(){string s1 = "Hello Hello string world";string s2 = "Hello Hello"; // cout << shorterString(s1,s2) ;auto sz = shorterString(s1,s2).size();cout << sz << endl;return 0; }

引用返回左值

  • 函數(shù)的返回類型決定了函數(shù)的調(diào)用是否是左值。
  • 返回引用的函數(shù)得到左值,其他類型的函數(shù)返回右值。可以像使用其他左值的使用方式一樣來(lái)返回引用的函數(shù)的調(diào)用,特別的是,可以為返回類型是非常量的引用的函數(shù)的結(jié)果進(jìn)行賦值。
char &get_val(string &str,string::size_type ix){return str[ix]; } int main(){string a("a Value"); //輸出a valuecout << a << endl;get_val(a,0) = 'A';//將s[0]的數(shù)值改為Acout << a << endl; //將輸出A valuereturn 0; }
  • 返回讀的值是引用,因此調(diào)用是一個(gè)左值,和其他的左值一樣他也能出現(xiàn)在賦值運(yùn)算符號(hào)的左側(cè)
  • 如果返回的類型是對(duì)于常量的引用,不能給調(diào)用的結(jié)果賦值

列表初始化返回值

  • 函數(shù)可以返回花括號(hào)內(nèi)包圍的熟知的列表。類似于其他返回的結(jié)果,此處的列表也用來(lái)對(duì)于對(duì)于表示函數(shù)返回的臨時(shí)量進(jìn)行初始化。如果列表為空,臨時(shí)量執(zhí)行數(shù)值初始化,否則返回的數(shù)值由函數(shù)的返回的類型決定。

主函數(shù)main的返回?cái)?shù)值

  • 函數(shù)的返回類型不是void,必須返回一個(gè)數(shù)值,但是mian函數(shù)例外,允許main函數(shù)沒(méi)有return語(yǔ)句直接結(jié)束。如果控制到達(dá)了main函數(shù)的結(jié)尾而且沒(méi)有return語(yǔ)句,編譯器會(huì)隱式插入一個(gè)返回為0的return語(yǔ)句。
  • mian函數(shù)的返回?cái)?shù)值可以看做是狀態(tài)的指示器。返回0表示執(zhí)行成功,其他數(shù)值表示返回失敗,其中非0的數(shù)值由具體機(jī)器而定。為了使得返回的類型和機(jī)器無(wú)關(guān),可以引入兩個(gè)預(yù)處理的變量,分別用來(lái)表示成功和失敗。
if(1){return EXIT_SUCCESS;}else{return EXIT_FAILURE;}
  • 其中EXIT_SUCCESS和EXIT_FAILURE定義在頭文件cstdlib頭文件中
  • 因?yàn)樯厦鎯蓚€(gè)變量屬于預(yù)處理變量,因此既不需要在前面加上std::也不能在using聲明中出現(xiàn)。

遞歸

  • 如果一個(gè)函數(shù)調(diào)用了它自身,無(wú)論是直接還是間接調(diào)用都稱該函數(shù)是遞歸函數(shù)。
  • 例子:使用遞歸函數(shù)實(shí)現(xiàn)求階乘的功能
int factorial(int val){if(val > 1 ){return factorial(val - 1) * val;return 1;} } int main(){cout << factorial(5) << endl;return 0; }
  • 注意事項(xiàng),在使用遞歸函數(shù)的時(shí)候,一定會(huì)包含一支路徑是不包含遞歸調(diào)用的,否則函數(shù)將會(huì)永遠(yuǎn)的執(zhí)行下去。

6.3.3 返回?cái)?shù)組的指針

  • 因?yàn)閿?shù)組不能被拷貝,因此函數(shù)不會(huì)返回?cái)?shù)組。但是,函數(shù)可以返回?cái)?shù)組的指針或者引用,其中最為有效的方法是使用類型別名的方式。
typedef int arrT[10];//arrT是一個(gè)類型的別名,它表示的類型是含有10個(gè)整數(shù)的數(shù)組using arrT = int[10];//arrT的等價(jià)聲明arrT* func(int i);//func返回一個(gè)指向含有10個(gè)整數(shù)的數(shù)組的指針

聲明一個(gè)返回?cái)?shù)組指針的函數(shù)

  • 要想在聲明func時(shí)不使用類型別名,必須牢記被定義的名字后面的數(shù)組的維度
int arr[10]; //arr是一個(gè)含有10個(gè)整數(shù)的數(shù)組int *p1[10]; //p1是一個(gè)含有10個(gè)指針的數(shù)組int (*p2)[10] = &arr; //p2是一個(gè)指針,指向含有10個(gè)整數(shù)的數(shù)組
  • Type (*function(parameter_list))[dimension]
  • 其中Type表示元素的類型,dimension表示數(shù)組的大小,(*function(parameter_list))兩邊的括號(hào)必須存在,就像上面對(duì)于p2的定義一樣,如果沒(méi)有這對(duì)括號(hào),函數(shù)的返回類型是指針的數(shù)組。

例子

  • int (*func(int i))[10];
  • func(int i)表示調(diào)用func函數(shù)的時(shí)候需要一個(gè)int類型的實(shí)參
  • (*func(int i))[10] 表示解引用func的調(diào)用將得到一個(gè)大小是10的數(shù)組
  • int (*func(int i))[10]表示數(shù)組中的元素類型是int類型

使用尾置返回類型

  • 可以使用尾置返回類型來(lái)替代上面提到的func聲明的方法。
  • 任何函數(shù)都可以使用尾置返回,即使是返回類型比較復(fù)雜的函數(shù)也仍然可以使用,比如返回類型是數(shù)組的指針或者數(shù)組的引用。
  • 尾置返回類型跟在形參列表的后面,并且以一個(gè)->符號(hào)開頭。為了表示函數(shù)真正的返回類型跟在形參列表之后,在本應(yīng)該出現(xiàn)返回類型的地方放置一個(gè)auto。
//func接受一個(gè)int類型的實(shí)參,返回一個(gè)指針,這個(gè)指針指向含有10個(gè)整數(shù)的數(shù)組 auto func(int i) -> int(*)[10];
  • 把函數(shù)的返回值類型放在了形參列表的后面,所以func函數(shù)返回的是一個(gè)指針,并且這個(gè)指針指向了含有10個(gè)整數(shù)的數(shù)組

使用decltype(這一部分有問(wèn)題)

  • decltype關(guān)鍵字一般用于知道函數(shù)返回的指針指向哪個(gè)數(shù)組的時(shí)候進(jìn)行對(duì)于返回類型的聲明。
  • 例子:函數(shù)返回一個(gè)指針,該指針可以根據(jù)參數(shù)i的不同指向兩個(gè)已知數(shù)組中的一個(gè)
int odd[] = {1,3,5,7,9};int even[] = {0,2,4,6,8};//返回一個(gè)指針,這個(gè)指針指向含有5個(gè)整數(shù)的數(shù)組decltype (odd) *arrPtr (int i){return (i % 2) ? &odd :&even;}
  • 程序無(wú)法執(zhí)行
  • decltype并不負(fù)責(zé)把數(shù)組類型轉(zhuǎn)化成對(duì)應(yīng)的指針,所以decltype的結(jié)果是一個(gè)數(shù)組,要想表示attPtr返回指針還必須在函數(shù)生命的時(shí)候加上一個(gè)*號(hào)。

總結(jié)

以上是生活随笔為你收集整理的C++ primer第六章函数的学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲精品中文字幕视频 | 欧美午夜性生活 | 成人午夜影院在线观看 | 国产精品嫩草55av | 国产香蕉97碰碰久久人人 | 亚洲视频在线观看网站 | 国产黄色一级片在线 | 成人午夜电影久久影院 | 国产一级高清视频 | av看片网| 亚洲精欧美一区二区精品 | 久久精品女人毛片国产 | 丁香六月综合网 | 99爱这里只有精品 | 日韩精品一区二区三区第95 | 国产精品视频久久久 | 国产精品免费久久久久久久久久中文 | 色999精品 | 99久久精品免费看国产免费软件 | 男女全黄一级一级高潮免费看 | 天天操天天添 | 日韩综合一区二区三区 | 狠狠色伊人亚洲综合网站色 | 亚洲精品成人av在线 | 国产福利不卡视频 | 日韩欧美综合视频 | 国产超碰在线 | 九九精品视频在线看 | 久国产在线播放 | 欧美日韩精品免费观看 | 在线观看黄a| 国产福利网站 | 久久久久亚洲精品国产 | 国产69精品久久久久久久久久 | 国产精品久久久久免费观看 | 国产精品高潮呻吟久久av无 | 中文字幕成人在线观看 | 日本最新中文字幕 | 六月激情 | 免费毛片aaaaaa | 久久99精品国产91久久来源 | 欧美性极品xxxx做受 | 999久久久免费视频 午夜国产在线观看 | 亚洲精品9 | 亚洲午夜av久久乱码 | 伊人va| 9在线观看免费高清完整版在线观看明 | 日韩久久精品一区二区 | 91chinese在线 | www..com黄色片| 日韩二区在线播放 | 91成人在线视频 | 欧美日韩在线网站 | 国产视频精品免费播放 | 伊人天天色 | 欧美日韩网站 | 日韩在线观看视频网站 | 美女在线观看网站 | 日韩高清dvd | 国产亚洲综合性久久久影院 | 国产精品中文字幕在线 | 国产电影一区二区三区四区 | 黄色一级性片 | 免费欧美高清视频 | 97人人添人澡人人爽超碰动图 | 亚洲精品视频在线观看免费视频 | 亚洲在线日韩 | 欧美经典久久 | 午夜国产福利在线 | 在线国产视频观看 | 精品自拍av | 久久国产精品视频观看 | 久久官网 | 在线观看一级片 | 日本不卡123区 | av在线免费观看黄 | 色资源中文字幕 | 伊人看片| 国产免费小视频 | 啪啪肉肉污av国网站 | 亚洲激精日韩激精欧美精品 | 久久精品视频在线 | 伊色综合久久之综合久久 | 岛国一区在线 | 日日碰狠狠添天天爽超碰97久久 | 在线看片日韩 | 国产精品中文在线 | 美女在线观看av | 中文字幕在线观看av | 国产99精品在线观看 | 国产精品久久久久久av | 亚洲精品久久久久中文字幕二区 | 亚洲视屏在线播放 | 欧美一级激情 | 九九久久久久99精品 | 国产精品毛片久久久 | 香蕉日日 | 91视视频在线直接观看在线看网页在线看 | 麻花豆传媒mv在线观看网站 | h久久| 色夜影院 | 五月亚洲综合 | 国产精品男女视频 | 特级黄色一级 | 成人a级网站 | 少妇高潮流白浆在线观看 | 日本中文乱码卡一卡二新区 | 久久久久久久久电影 | 天天躁天天狠天天透 | 欧美一级电影片 | 久久新视频 | 免费在线观看国产黄 | 久久99久久久久 | 国产精品日韩欧美一区二区 | 成年人免费在线观看网站 | 天天插天天干天天操 | 少妇bbb搡bbbb搡bbbb′ | 精品产品国产在线不卡 | av7777777| 亚洲国产精彩中文乱码av | 亚洲精品毛片一级91精品 | 天天射天天做 | 日日爱av| 国产在线播放不卡 | 一区二区三区免费在线观看 | 日韩免费视频观看 | 久草资源免费 | 成人av观看 | www.婷婷com| 国产福利精品视频 | 激情综合国产 | av免费观看高清 | 欧美国产高清 | 最新国产福利 | 亚洲精品动漫久久久久 | 久久亚洲成人网 | 六月丁香色婷婷 | 久久久精品久久 | 啪嗒啪嗒免费观看完整版 | 欧美性春潮| 国产91电影在线观看 | 国产精品欧美 | 狠狠干夜夜 | 久精品视频 | www.夜夜夜 | 在线看成人 | 草久视频在线观看 | 国产精品久久久久久999 | 国产精品久久久久久久av电影 | 久久精品小视频 | 久久午夜影视 | 欧美激情视频三区 | 婷婷综合在线 | 国产免费又粗又猛又爽 | 亚洲成人网av | 99热精品国产一区二区在线观看 | 国产日韩欧美精品在线观看 | 欧美日韩亚洲第一 | 最新中文在线视频 | 97在线视 | 激情视频一区 | 日本午夜免费福利视频 | 天天干天天做 | 国内精品中文字幕 | 国产精品爽爽爽 | 精品国产91亚洲一区二区三区www | 午夜色大片在线观看 | 九九九热精品免费视频观看 | 久久精品精品电影网 | 婷婷四房综合激情五月 | 狠狠色丁香婷婷 | 国产色综合 | 五月婷婷综合在线 | 亚洲精品久久久久久久蜜桃 | av爱干| 日韩av片无码一区二区不卡电影 | 激情综合网五月 | av在线播放中文字幕 | 久久五月天色综合 | 亚洲精品午夜久久久久久久久久久 | 精品国产精品久久一区免费式 | 国产成人精品一区二区在线 | 亚洲精品毛片一级91精品 | 一区二区三区四区五区在线视频 | 国产区在线 | 热热热热热色 | 在线观看视频免费大全 | 国产精品久久久久久久电影 | 日韩免费电影一区二区三区 | 黄色一级动作片 | 国产99久久久国产精品免费看 | 久久综合狠狠综合久久综合88 | 91麻豆网| 天天躁日日躁狠狠躁av中文 | 韩国av免费看 | av在线短片| 天天草天天插 | 午夜精品久久久久 | 国产亚洲午夜高清国产拍精品 | 在线有码中文字幕 | 久久成人一区二区 | 国产在线观看高清视频 | 中文字幕在线视频一区二区三区 | 日韩影视精品 | 中文字幕人成一区 | 美女久久久久 | 日韩最新理论电影 | 狠狠做深爱婷婷综合一区 | 国产网红在线观看 | 新版资源中文在线观看 | 国产麻豆精品传媒av国产下载 | 日韩精品欧美一区 | 国产精品久久久久久999 | 天堂在线视频中文网 | 婷婷六月丁香激情 | 婷婷网五月天 | 五月婷婷综合激情网 | 国产亚洲精品久久久久久电影 | 久草电影免费在线观看 | 国产精品1区2区3区在线观看 | 久久免视频 | 色精品视频 | 日韩中文字幕91 | 午夜91在线 | 久久99热久久99精品 | 国产精品一区二区三区观看 | 国产日韩三级 | 亚洲精品在线免费观看视频 | 狠狠狠的干 | 在线天堂中文在线资源网 | 欧美另类xxx | 久久久久在线视频 | 午夜黄色大片 | 国产免费一区二区三区最新6 | 亚洲精品美女在线观看播放 | 国产精品99久久久久的智能播放 | 欧美做受高潮 | av中文在线 | 久久久久久99精品 | 免费视频成人 | 日韩视频一区二区 | 国产精品一区二区久久国产 | 韩国av在线播放 | 亚洲在线高清 | 伊人伊成久久人综合网站 | 免费精品在线视频 | 日韩欧美一区二区在线播放 | 在线中文字幕电影 | 亚洲一区精品二人人爽久久 | 五月婷婷激情五月 | 精品视频免费观看 | 国产成人免费在线观看 | 国产精品美女久久久久久久 | 午夜精品电影 | 亚洲在线观看av | 久久视频国产精品免费视频在线 | 国产精品欧美久久 | 久久99精品国产麻豆婷婷 | 美女视频黄在线 | 6080yy午夜一二三区久久 | 久久久久福利视频 | 久草在线资源视频 | 亚洲精品99久久久久久 | 国产精品美女久久久免费 | 国产.精品.日韩.另类.中文.在线.播放 | 色噜噜狠狠色综合中国 | 午夜精品久久久久久 | 日韩av片无码一区二区不卡电影 | 国产一级免费在线观看 | 狠狠色丁香婷婷综合视频 | 五月天色综合 | 国产区久久 | 97超碰在| 国产在线va | 欧美孕交vivoestv另类 | 伊人天天狠天天添日日拍 | 午夜色婷婷 | 九九热在线观看 | 992tv又爽又黄的免费视频 | 91中文字幕在线播放 | 亚洲人人网 | 国产96精品| 国产专区在线视频 | 97超碰国产精品 | 国产拍揄自揄精品视频麻豆 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | av三级av | 欧美日韩性生活 | 免费黄色一区 | 欧日韩在线视频 | 色综合天天综合在线视频 | 天天综合网~永久入口 | 97精品国产一二三产区 | 天天天天色射综合 | av爱干 | 在线视频麻豆 | 91爱爱电影 | 在线观看亚洲精品视频 | 欧美成人高清 | 精品国产视频在线 | 国产精品免费在线视频 | 国产在线精品区 | 日韩一区二区三区高清在线观看 | 日韩理论在线观看 | 日韩不卡高清视频 | 国产精品高潮久久av | 久久婷婷一区二区三区 | 日韩一区二区免费在线观看 | 在线播放国产一区二区三区 | 亚洲免费不卡 | 一本大道久久精品懂色aⅴ 五月婷社区 | 久久视频在线看 | 免费视频一区二区 | 国产成人在线观看 | 日韩网站在线看片你懂的 | 青青久视频 | 久久视频免费看 | 亚洲经典视频在线观看 | 天天激情 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 日本不卡一区二区 | 国产精品久久久久久久久蜜臀 | 中文在线免费看视频 | 亚洲精品免费播放 | 13日本xxxxxⅹxxx20| 久久久久久久久久久国产精品 | 成av在线| 粉嫩高清一区二区三区 | 精品久久久久免费极品大片 | 日韩av一区二区三区 | 西西4444www大胆无视频 | 在线免费观看黄色大片 | 午夜黄网 | 极品美女被弄高潮视频网站 | 欧美有色 | 亚洲精品一区二区在线观看 | 亚洲高清视频在线观看免费 | www色,com| 六月丁香六月婷婷 | 四虎影视成人永久免费观看亚洲欧美 | 麻豆一二 | 中文字幕日韩无 | 成人欧美一区二区三区黑人麻豆 | 中文乱幕日产无线码1区 | 伊人色综合网 | 国产色啪 | 天天爽人人爽 | 日韩视频免费观看高清 | 日韩欧美视频 | 又黄又爽又刺激视频 | 天天干天天干 | 91丨九色丨91啦蝌蚪老版 | 成人av中文字幕 | 国产精品一区二区久久久 | 亚洲成人av在线电影 | 久久99国产精品自在自在app | 国产精品久久久久久高潮 | 亚洲精品日韩在线观看 | 欧美在线观看小视频 | 91亚洲精品久久久蜜桃网站 | 久久精品一区二 | 操久在线 | 91在线亚洲| 激情五月在线视频 | 波多野结衣在线播放视频 | 99久久久国产精品免费观看 | 欧美人交a欧美精品 | 中文字幕久久精品一区 | 999久久久国产精品 高清av免费观看 | 亚洲免费小视频 | 狠狠色丁香婷婷综合 | 亚洲精品 在线视频 | 国产在线美女 | 亚洲精品www久久久久久 | 国产三级午夜理伦三级 | 日韩网页 | 国语对白少妇爽91 | 亚洲永久精品一区 | www免费网站在线观看 | av大片免费 | 国产成人黄色av | 精品欧美一区二区在线观看 | 国产高清免费在线观看 | 精品欧美一区二区三区久久久 | 在线а√天堂中文官网 | a色视频 | 一本一道波多野毛片中文在线 | 成人超碰在线 | 四虎国产免费 | 国产一区二区午夜 | 国产精品毛片一区视频播 | 欧美在线视频精品 | 中文字幕一区二区三区在线观看 | a在线视频v视频 | 91视频国产高清 | 欧美大片在线看免费观看 | 久久九精品 | 91在线日本| 亚洲视频综合 | 久久99中文字幕 | 日韩av资源站 | 怡红院av久久久久久久 | 国产视频一区二区在线播放 | 中文字幕亚洲在线观看 | 日韩精品久久久久久久电影竹菊 | 99久久日韩精品免费热麻豆美女 | 91精品国产福利在线观看 | 99热手机在线 | 狠狠狠色丁香婷婷综合激情 | 久久精品国产亚洲aⅴ | 亚洲精品乱码久久久久久高潮 | 欧美精品亚洲二区 | 91在线porny国产在线看 | 手机色在线 | 久碰视频在线观看 | 亚洲一区动漫 | 色视频成人在线观看免 | 超级碰碰碰免费视频 | 在线视频日韩精品 | 久久99精品久久久久久清纯直播 | 午夜影视一区 | 涩涩成人在线 | 日韩a免费 | 久久久午夜精品福利内容 | 永久精品视频 | 日韩av女优视频 | 免费av高清 | 五月婷婷操 | 亚洲理论视频 | 国产黄色片久久久 | 天天操天天色天天 | 一区二区三区在线观看中文字幕 | 精品国产一区二区三区男人吃奶 | 欧美精品一区二区性色 | 91精品免费 | 五月开心六月婷婷 | 欧美日韩在线观看一区二区 | a色视频| av在线免费播放 | 国产九九九九九 | 欧美成年人在线观看 | 国产aaa大片 | 中文字幕国产在线 | 99精品视频中文字幕 | 亚洲国产一区二区精品专区 | 天天爽天天摸 | 国产精品日韩欧美一区二区 | 日韩黄色一级电影 | 美女久久久久久久久久 | 国产精品一区二区三区在线免费观看 | 亚洲欧美日韩不卡 | 国产精品视频免费看 | 五月天.com| 日韩电影一区二区在线观看 | 色综合国产 | 欧美性一级观看 | 最新超碰 | 香蕉视频在线免费看 | 69国产在线观看 | 天堂中文在线播放 | 激情五月av | 国产婷婷色 | 天天躁日日躁狠狠躁av中文 | 中文字幕国语官网在线视频 | 欧美激情亚洲综合 | 免费网站v | 日韩激情综合 | 日韩电影在线观看一区二区三区 | 色资源网在线观看 | 青草视频在线免费 | av中文字幕网 | 亚洲精品久久久蜜臀下载官网 | 这里只有精品视频在线观看 | 亚洲国产美女精品久久久久∴ | 国产美腿白丝袜足在线av | 国产成人精品亚洲日本在线观看 | 日日干网| 欧美一区二区三区免费看 | 玖玖视频网 | 99999精品| 成人久久| 精品一区二区免费 | 国产精品视频内 | 精品视频国产 | 久久免费视频3 | 在线视频欧美精品 | 国产国语在线 | 久久人人爽人人片 | 国精产品永久999 | 国产精品毛片一区视频播不卡 | 99久e精品热线免费 99国产精品久久久久久久久久 | 99综合电影在线视频 | 狠狠色丁香久久婷婷综 | 91视频这里只有精品 | 夜夜骑日日 | 中文字幕一区二区三区乱码不卡 | 亚洲成a人片在线观看网站口工 | 国产精品粉嫩 | 免费看黄的视频 | 中文字幕丝袜制服 | 久久久久这里只有精品 | 国产精品理论视频 | 欧美日韩在线观看一区二区三区 | 国产精品女主播一区二区三区 | 操操操com | 91热在线| 久久久久亚洲最大xxxx | 精品九九久久 | 果冻av在线 | 中文字幕一区二区三区久久蜜桃 | 国产99久久九九精品免费 | 国产免费嫩草影院 | 91禁在线看 | 99视频偷窥在线精品国自产拍 | 99久久精品日本一区二区免费 | 亚洲国产精品va在线看黑人 | 精品字幕在线 | 久久久麻豆精品一区二区 | 女人久久久久 | 国产日产欧美在线观看 | 伊人久久av | 天天视频色版 | 97自拍超碰 | 一个色综合网站 | 天天天色| 黄色一区二区在线观看 | 波多野结衣电影久久 | 一区二区三区韩国免费中文网站 | 天天干人人 | 在线看黄网站 | 天干啦夜天干天干在线线 | 日韩免费看视频 | 成人久久18免费网站图片 | 国产一区视频在线 | 伊人伊成久久人综合网站 | 亚洲精品在线资源 | 久久99免费观看 | av黄色国产| 国产在线观看不卡 | 欧美激情视频久久 | 精品无人国产偷自产在线 | 麻豆av一区二区三区在线观看 | 天天色天天综合网 | 日韩高清一区在线 | 成人av在线电影 | 国产精品6999成人免费视频 | 天天操夜夜想 | 免费观看xxxx9999片 | 久久影院午夜论 | 亚洲精品videossex少妇 | 人人超在线公开视频 | 欧美日韩精品国产 | www.亚洲激情.com | 综合精品久久 | 国产1区2区| 在线观看黄a | 欧美黄在线 | av动图| 国产精品成人国产乱一区 | 精品国产aⅴ麻豆 | 亚洲高清资源 | 免费看成人 | av在线电影网站 | 国产成人福利在线 | 免费观看性生交 | 青青草华人在线视频 | 人人澡视频 | 精品亚洲免费视频 | 国产精品久久久久久妇 | 黄色视屏av | 色99中文字幕| 激情丁香婷婷 | 中文字幕日韩精品有码视频 | 中文字幕高清免费日韩视频在线 | 久久免费公开视频 | 日本精品久久久久久 | 丰满少妇对白在线偷拍 | 中文字幕成人一区 | 国产精品久久久影视 | 91精品国产福利在线观看 | 91在线国内视频 | 91精品国产乱码久久 | 在线国产视频一区 | 免费性网站 | 超薄丝袜一二三区 | 久久夜夜爽 | 日韩成年视频 | 一区二区三区在线影院 | 亚洲综合在线五月 | 亚洲精品小视频在线观看 | 日韩欧美电影网 | 国产婷婷在线观看 | 久久精品久久99精品久久 | 五月婷婷综合激情网 | 91人人澡人人爽人人精品 | 久久久久久久99精品免费观看 | 一区二区三区观看 | 二区视频在线 | 欧美日韩中文在线视频 | 久久久免费国产 | 国产视频黄 | 国产精品毛片一区二区在线 | 日本深夜福利视频 | 国产美女免费视频 | 国产精品久久久亚洲 | 婷婷在线视频观看 | 婷婷伊人综合亚洲综合网 | 国产xvideos免费视频播放 | 久久久香蕉视频 | 久久久免费高清视频 | 亚洲另类视频在线观看 | 国产精品黄色在线观看 | 亚洲视频每日更新 | 国产特级毛片aaaaaa高清 | 最近高清中文字幕在线国语5 | 草在线 | 国产精品久久久久久一二三四五 | 五月婷婷一级片 | 久久电影中文字幕视频 | 一本一本久久a久久精品综合小说 | 国产欧美综合在线观看 | 超碰97人人在线 | 精品视频久久 | 中文字幕亚洲欧美日韩2019 | 最近在线中文字幕 | 狠狠色噜噜狠狠狠狠 | 午夜久久久久久久久久影院 | 免费观看mv大片高清 | 欧美日韩视频在线一区 | 久久99精品久久久久久 | 美女搞黄国产视频网站 | 日韩网站在线免费观看 | 久久国产精品99国产 | 色婷婷狠狠五月综合天色拍 | 日本婷婷色 | 久久99亚洲网美利坚合众国 | 精品免费久久久久久 | 啪啪小视频网站 | 中文在线字幕免费观看 | 97色免费视频 | 国产一区视频免费在线观看 | 天天爱天天舔 | 成年人精品 | 99超碰在线观看 | 久久中文字幕在线视频 | 操操综合 | 在线a视频 | 欧美巨大荫蒂茸毛毛人妖 | 久草在线免费资源 | 天天爱天天操天天爽 | 天天操操操操操 | 97人人视频 | 91精品一区二区三区久久久久久 | 国产视频一区二区在线观看 | 91热精品| 精品中文字幕在线观看 | 国产视频在线观看一区 | 日本中文字幕在线免费观看 | 97碰碰视频 | av韩国在线| 国产小视频在线 | 天天做天天爱夜夜爽 | 在线免费中文字幕 | 亚洲天堂视频在线 | 人人爽人人乐 | 国产剧情一区二区 | 五月天丁香| www.激情五月.com | 日日婷婷夜日日天干 | 色综合天天视频在线观看 | 丝袜美腿一区 | 欧美日韩在线免费视频 | 欧美午夜精品久久久久 | 久久视奸| 国产剧情av在线播放 | 91在线精品播放 | 欧美日韩视频在线观看免费 | 在线观看视频日韩 | 久久经典国产视频 | 精品免费 | 五月婷婷久久丁香 | 毛片3 | 激情丁香5月 | 免费看污的网站 | 亚洲欧洲xxxx | 91成人午夜| 欧美久草视频 | 亚洲天堂自拍视频 | 久久综合导航 | 婷婷激情综合 | 国产成人精品久久二区二区 | 亚洲一区二区高潮无套美女 | 懂色av一区二区在线播放 | 久久婷婷国产 | 亚洲第五色综合网 | 日韩精品视频网站 | 91精品麻豆| 91精品一区二区在线观看 | 免费在线一区二区三区 | 成人黄大片| 热re99久久精品国产66热 | 亚洲第一区在线观看 | av不卡中文| 91在线看片 | 亚洲国产精品一区二区久久,亚洲午夜 | 人人干,人人爽 | 97高清免费视频 | 国产97av| 久久全国免费视频 | 99久久久国产精品 | 欧美日韩精品在线一区二区 | 免费在线观看av电影 | 午夜三级理论 | 久久视频这里有精品 | 国产成人一区二区三区在线观看 | 久久av影视 | 久久成人免费 | 日韩一区二区三区免费电影 | 免费在线观看不卡av | 99久久婷婷国产一区二区三区 | 91综合久久一区二区 | 奇米网8888 | 久久久久久久久久网站 | 黄色软件在线观看 | 国产精品18久久久久久久 | 国产精品手机播放 | 人人澡人人爱 | 婷婷综合伊人 | 成人av电影免费观看 | 在线观看免费av片 | 视频在线91| 国产精品久久久久一区二区三区 | 日狠狠 | 狠狠色伊人亚洲综合成人 | 免费福利在线视频 | 成人免费在线播放 | 午夜久久网站 | 日韩 国产| 人人澡人人澡人人 | 最新国产在线视频 | 九色精品免费永久在线 | 久久久久久久久综合 | www.黄色小说.com | 2024国产在线 | 日本动漫做毛片一区二区 | 欧美日韩国产精品一区二区三区 | 日韩在线观看一区二区 | 欧美日韩国产亚洲乱码字幕 | 日韩在线观看免费 | 国产精品国产三级国产aⅴ9色 | 免费在线国产精品 | 久久精品免费播放 | 国产第一页在线观看 | 亚洲国产午夜视频 | 免费在线黄色av | 国产免费激情久久 | 欧美一级激情 | 中文字幕av网站 | 国产一级免费在线 | 成人午夜久久 | 精品欧美一区二区在线观看 | 天天操天天摸天天射 | 在线黄网站 | 香蕉免费在线 | 国产精品对白一区二区三区 | 999视频精品 | 亚洲色图av | a级国产乱理论片在线观看 特级毛片在线观看 | 国产高清精品在线观看 | 亚洲精品观看 | 久草国产精品 | 五月婷婷丁香六月 | 欧美精品免费在线 | 午夜精品久久久久99热app | 欧美在线视频一区二区三区 | 日本久久久亚洲精品 | av亚洲产国偷v产偷v自拍小说 | 免费又黄又爽视频 | 国产亚洲一区二区在线观看 | 一级c片| 久久久久久蜜桃一区二区 | 91视频国产高清 | 国内精品久久久久影院一蜜桃 | av中文字幕在线播放 | 最新色站 | 香蕉久久久久久av成人 | 免费污片 | 日韩欧美69 | 成人精品久久 | 国产精品麻 | 国产精品毛片一区二区三区 | 免费视频你懂得 | 五月婷婷丁香色 | 五月婷婷六月综合 | 欧美大荫蒂xxx | 国产精品久久久免费看 | 日本一区二区三区视频在线播放 | 久久精品国产美女 | 五月激情天 | 国产精品麻豆视频 | 日本三级吹潮在线 | 综合天堂av久久久久久久 | 免费观看成人网 | 中文 一区二区 | 久久久久久久久久免费视频 | 欧美性猛片| 开心激情网五月天 | 91麻豆福利 | 黄色.com| 亚洲一区二区三区四区在线视频 | 免费精品在线视频 | 国产中文字幕国产 | 欧洲av不卡| 久草在线资源观看 | 亚洲一区二区视频在线 | 中文字幕一区二区三区乱码在线 | 欧美激情精品久久久久久变态 | 91精品1区2区 | 国产精品资源在线观看 | 网站免费黄 | 免费观看的黄色片 | 国产福利一区二区在线 | 国产精品一区二区免费在线观看 | 97天堂网| 欧美人交a欧美精品 | 色播亚洲婷婷 | a√天堂中文在线 | 国产一级视频在线观看 | 成人av地址 | av福利在线免费观看 | 成人动漫一区二区 | 91精品啪啪 | 婷婷六月综合网 | 在线观看视频精品 | 成人a大片 | 久久成人国产精品入口 | 亚洲视频在线看 | 久久综合欧美 | 日韩在线免费小视频 | 天天色综合三 | 午夜色大片在线观看 | 久久久亚洲国产精品麻豆综合天堂 | 欧美另类一二三四区 | 久久五月精品 | 午夜久久成人 | 2023国产精品自产拍在线观看 | 999久久a精品合区久久久 | 中文字幕在线视频一区二区三区 | 69视频在线 | 日韩黄色在线 | 婷婷深爱网 | 日韩高清在线观看 | 婷婷精品进入 | 国产麻豆果冻传媒在线观看 | 午夜精品福利一区二区三区蜜桃 | 久久久高清一区二区三区 | 18性欧美xxxⅹ性满足 | 97色综合| 在线亚洲高清视频 | 中文字幕在线观看亚洲 | 热久在线| 99操视频| 伊人视频| 91激情小视频 | 中文字幕在线电影 | 亚州av免费 | 久久综合五月天婷婷伊人 | 国产精品高潮呻吟久久av无 | av电影在线不卡 | 国产一区二区在线免费观看 | 成人av在线影院 | 中文字幕在线观看免费观看 | 四虎视频 | 在线观看日本韩国电影 | 日韩av中文在线 | 天天射天天操天天色 | 中文字幕精品一区久久久久 | 欧美伦理一区 | 最新日韩在线 | 日韩av免费一区 | 三上悠亚一区二区在线观看 | 高清av免费看 | 欧美日韩国语 | 欧美日韩伦理在线 | 色婷婷免费视频 | 久久久一本精品99久久精品66 | 午夜婷婷综合 | 九九热在线视频 | 日本中文字幕电影在线免费观看 | www.午夜色.com| 毛片无卡免费无播放器 | 五月激情视频 | 国语自产偷拍精品视频偷 | 99久精品 | 久久久久女人精品毛片九一 | 精品免费久久 | 国产三级在线播放 | 黄色精品视频 | 欧美日韩高清在线一区 | 九九精品视频在线观看 | 夜夜骑日日 | 99精品在线免费在线观看 | 97视频人人澡人人爽 | 国产免费视频一区二区裸体 | 亚洲资源视频 | 国产资源| 88av色| 成人一级影视 | 久久伊人免费视频 | 91九色国产 | 一级大片在线观看 | 国产高清在线观看 | 成人在线视频网 | 91av超碰| 美女视频免费一区二区 | 黄色一集片 | 国产精品久久久久久久久大全 | 最新久久久| 国产一级久久 | 国产精品美女久久 | 久久激情五月婷婷 | 中文字幕日韩一区二区三区不卡 | 久久国产精品一国产精品 | 五月色丁香| www免费看 | 亚洲蜜桃在线 | 91秒拍国产福利一区 | 超碰99人人 | 久久精品国产成人精品 | 国产精品中文字幕在线 | 国产精品igao视频网网址 | 成人免费在线视频观看 | 又爽又黄在线观看 | 美女免费视频黄 | 国产99区| 国产美女视频一区 | 成人啊 v| 欧美日韩在线观看一区 | 久艹在线观看视频 | 日本久久久久久久久久久 | 91精品国产高清自在线观看 | 日韩精品最新在线观看 | 色综合久久五月天 | 午夜少妇av | 免费91在线| 欧美日韩精品综合 | 毛片美女网站 | 日韩大片在线观看 | 日韩精品一区二区三区在线视频 | av色网站 | 亚洲高清国产视频 | 日韩动漫免费观看高清完整版在线观看 | 亚洲欧美日韩不卡 | 美女视频一区二区 | 亚洲一二三久久 | a黄色一级 | 特级a毛片| 欧美视屏一区二区 | 亚洲日本在线视频观看 | 一级性av| 日韩av成人免费看 | 狠狠操操| 在线免费视频 你懂得 | 成人黄色毛片视频 | 免费视频成人 | 综合在线亚洲 | 91成人精品观看 | 久久伊人热| 精品亚洲视频在线观看 | 99色在线视频 | 国产成人精品日本亚洲999 | 国产精品福利视频 | 狠色在线 | 五月婷婷在线观看视频 | 日日日爽爽爽 | www.97视频| 天天草综合 | 波多野结衣一区二区 | 久久久99精品免费观看乱色 | 激情黄色av| 97国产人人| 国产精品嫩草影院99网站 | 成人网在线免费视频 | 日本在线观看视频一区 | 亚洲精品久久久蜜桃直播 | 日韩精品欧美专区 | 91亚洲欧美激情 | 三级av免费看 | 国产亚洲va综合人人澡精品 | 四虎影视av | 婷婷九九| 免费在线激情电影 | 久久久久久久久久久黄色 | 中文字幕观看视频 | 色激情在线| 中文字幕免费观看全部电影 | av电影 一区二区 | 国产一级片不卡 |