成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C++中參數(shù)缺省和引用

 本篇文章將整理出關(guān)于參數(shù)缺省和引用的一些知識(shí)。

金牛網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,金牛網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為金牛近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的金牛做網(wǎng)站的公司定做!

(一)參數(shù)缺省:參數(shù)缺省包括全缺省和半缺省。顧名思義,全缺省就是函數(shù)的所有參數(shù)都給出默認(rèn)值,半缺省就是僅有函數(shù)的部分參數(shù)給出了默認(rèn)值??聪逻叺囊欢未a:

#include<iostream>  
using namespace std;  
  
int Add(int x, int y)  
{  
    return x + y;  
}  
int main()  
{  
    int ret = Add();  
    system("pause");  
    return 0;  
}

要是寫出上邊的一段代碼,低版本的vs會(huì)編譯不通過(guò),報(bào)錯(cuò)是Add函數(shù)不接收0個(gè)參數(shù),高版本vs會(huì)有紅色標(biāo)注。要是對(duì)于函數(shù)調(diào)用的時(shí)候不想給出參數(shù),我們可以使用默認(rèn)參數(shù),若將Add函數(shù)寫成這樣就好了:

int Add(int x = 0, int y = 0)  
{  
    return x + y;  
}

這就是所謂的全缺省。那么半缺省呢??繼續(xù)實(shí)例:

int Add(int x , int y = 0)  
{  
    return x + y;  
}  
int main()  
{  
    int ret = Add(10);  
    system("pause");  
    return 0;  
}

這樣子的話,最后會(huì)得到10和0相加。當(dāng)然調(diào)用的時(shí)候,我們也可以給出兩個(gè)參數(shù)。如果我們將x給出默認(rèn),y不默認(rèn),看可以不??

int Add(int x = 0 , int y)  
{  
    return x + y;  
}

要是Add函數(shù)寫成上邊這樣,高版本vs編譯器會(huì)紅線報(bào)錯(cuò):默認(rèn)參數(shù)不在參數(shù)列表末尾。想想這是為什么?其實(shí),想一下就明白了,調(diào)用的時(shí)候(當(dāng)然實(shí)參是只有一個(gè))會(huì)把給出的實(shí)參賦值給函數(shù)參數(shù)列表的第一個(gè)形參,肯定就不對(duì)了嘛。要是用更專業(yè)的說(shuō)法解釋,本人認(rèn)為:函數(shù)參數(shù)入棧的時(shí)候是實(shí)參進(jìn)入Add函數(shù)的棧幀,直接就當(dāng)作第一個(gè)參數(shù),所以~總結(jié):使用半缺省,缺省的參數(shù)只能在參數(shù)列表的最后邊。缺省參數(shù)的用途:假如要傳性別這個(gè)參數(shù)給函數(shù),我們又約定缺省為男,所以,只需要在需要傳的性別是女時(shí),給出參數(shù)。這就是缺省參數(shù)的用途。

(二)引用

引用就是給一個(gè)變量起一個(gè)別名。比如:

int a = 10;  
int &ra = a;//ra是a的別名  
int &refa = a;//refa也是a的別名

總結(jié):

  1. 一個(gè)變量可以有多個(gè)別名。     

  2. 定義引用的時(shí)候必須初始化(指明定義的引用是哪個(gè)變量的別名)。     

  3. 引用只能在初始化的時(shí)候引用一次。

既然說(shuō),一個(gè)變量可以有多個(gè)別名,改變了別名的值,也就改變了變量的值,是不是感覺(jué)引用就很不安全了??其實(shí)并不是,如果不想改變,可以使用const修飾。

int a= 10;  
const int &ra = a;  
ra = 20;//報(bào)錯(cuò)!

關(guān)于const,在c中const修飾的變量是常變量,既有常量的屬性,也有變量的屬性。在c++中,const修飾的變量就是常量。不可修改。在學(xué)習(xí)指針的時(shí)候,如果一個(gè)函數(shù)的功能僅僅是打印或者是某個(gè)參數(shù)不可以被改變的時(shí)候,我們可以用const修飾。在使用引用的時(shí)候也是一樣的。舉例:

void print_a(const int &ra)  
{  
    ra = 20;//報(bào)錯(cuò)(左值必須是可以修改的)  
    cout << ra << endl;  
}  
int main()  
{  
    int a = 10;  
    int &ra = a;  
    print_a(a);  
    system("pause");  
    return 0;  
}

在cpp中,如果const修飾的是局部變量,則該局部變量是在棧里。不是不可以修改,可以使用指針修改。如果const修飾的是全局變量,不使用的時(shí)候是不會(huì)被分配空間的(&n是錯(cuò)誤的),只有在使用的時(shí)候才有地址。

const int n = 10;  
int main()  
{  
    int a = 10;  
    int &ra = a;  
    int arr[n] = { 0 };//這里并不算使用n,此時(shí)的n仍相當(dāng)于宏標(biāo)識(shí)符  
    const int *p = &n;//n才有空間,并且是只讀區(qū),不可修改的。  
    system("pause");  
    return 0;  
}

關(guān)于const引用的正確使用:看下邊的幾段代碼:

const int n = 10;  
int &refa = n;

此時(shí) refa是可以改變的,進(jìn)而n的值可以改變。這就不對(duì)了嘛。(n是不可以改變的)。使得n從安全變成不安全。

int m = 10;  
const int &refm = m;

這個(gè)就是正確的。使得m從不安全變得安全。

const int &refd= 5;

這個(gè)是正確的。const修飾的refd是一個(gè)常量的引用。

double d = 6.15;  
int &refd = d;

這個(gè)是不對(duì)的。要是這樣就對(duì)了:

double d = 6.15;  
const int &refd = d;

為什么呢??由于引用的類型是int,變量的類型是double,所以此時(shí)就會(huì)用double類型的d創(chuàng)建一個(gè)臨時(shí)變量(也是d的隱式類型轉(zhuǎn)換),refd引用的是臨時(shí)變量。確切的說(shuō)就是臨時(shí)常量。此時(shí)refd =d,refd和d不在一個(gè)空間。引用作為函數(shù)參數(shù):這里需要聲明:引用的底層仍然是指針(這個(gè)可以通過(guò)匯編代碼觀到)。 下邊我們來(lái)測(cè)試傳引用和傳值得效率問(wèn)題:

#include<iostream>  
#include<windows.h>  
using namespace std;  
struct BigData  
{  
    int arr[100];  
};  
int getData(BigData bd)  
{  
    return bd.arr[0];  
}  
int main()  
{  
    BigData bd = { 0 };  
    int i = 0;  
    int start = GetTickCount();  
    for (i = 0;i < 100000000;i++)  
    {  
        getData(bd);  
    }  
    int end = GetTickCount();  
    cout << end - start << endl;  
    system("pause");  
    return 0;  
}

代碼測(cè)試出的結(jié)果是6000毫秒左右。注意:每次運(yùn)行的結(jié)果都不大一樣,這根CPU的狀態(tài)有關(guān)。當(dāng)把上邊代碼改為傳引用:效率可以提高大約一半,自己可以嘗試。引用作為函數(shù)的返回值:看代碼:

int& fun()  
{  
    int num = 10;  
    return num;  
}  
int main()  
{  
    int &ret = fun();  
    cout << ret << endl;  
    system("pause");  
    return 0;  
}

上邊這段代碼確實(shí)可以輸出10.不過(guò)要是把上邊的代碼做以修改:

int& fun()  
{  
    int num = 10;  
    return num;  
}  
int main()  
{  
    int &ret = fun();  
        printf("楊先生你好");  
    cout << ret << endl;  
    system("pause");  
    return 0;  
}

看上邊的代碼,在高版本的vs下輸出:楊先生你好10在低版本環(huán)境下ret的值會(huì)被改變。因?yàn)閞et接收的是局部變量num,兩者占用同一個(gè)空間當(dāng)num消失了,ret也就消失了,變成隨機(jī)值。高版本vs(比如vs2015)為什么ret的值一直是10,不知道做了什么優(yōu)化。。C++中參數(shù)缺省和引用如果將上邊的代碼做以修改:

int& fun()  
{  
    int num = 10;  
    return num;  
}  
int main()  
{  
      
    int ret = fun();  
    printf("楊先生你好");  
    cout << ret << endl;  
    system("pause");  
    return 0;  
}

這個(gè)ret的值不會(huì)改變。看原理:后者的ret就不是引用了,保存的僅僅是num的值,所以不會(huì)隨著num的消失而消失。當(dāng)引用作為函數(shù)的返回值的時(shí)候,有時(shí)會(huì)提高效率,有時(shí)并不會(huì)~~我們知道,當(dāng)函數(shù)的返回值,int或者double等等內(nèi)置類型時(shí),返回值是用寄存器帶回的。然而最大的寄存器也就32位,要是我們要返回一個(gè)比較大的結(jié)構(gòu)體時(shí),會(huì)使用引用,引用不會(huì)創(chuàng)建臨時(shí)變量,直接把需要帶回的值賦值給接收返回值的變量。

總結(jié):用函數(shù)的返回值的類型不是內(nèi)置類型時(shí),使用引用返回,會(huì)提高效率(減少創(chuàng) 建臨時(shí)對(duì)象)。當(dāng)返回的是內(nèi)置類型時(shí),會(huì)用寄存器帶回,跟使用引用返回的效率差不多。

引用和指針的區(qū)別:

1.指針在定義的時(shí)候可以不初始化,但是引用不行。

2.引用只能引用一個(gè)變量,而一般的指針變量并不是(除了const修飾的指針)

3.指針的大小僅與平臺(tái)有關(guān),而引用的大小與引用的對(duì)象的類型有關(guān)。

4.指針自加時(shí),使得指針指向當(dāng)前指向空間的下一個(gè)空間;引用自加時(shí),會(huì)使自身和它所引用的對(duì)象的值加1.5.引用比指針更安全。(使用指針時(shí),一定要檢查指針的值是否是NULL) 

網(wǎng)站題目:C++中參數(shù)缺省和引用
網(wǎng)站路徑:http://jinyejixie.com/article26/ppiojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、建站公司、ChatGPT、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
丘北县| 崇文区| 霍林郭勒市| 定兴县| 开封市| 娄烦县| 萝北县| 寿光市| 杭州市| 托里县| 乌鲁木齐市| 鄂托克旗| 泰安市| 泸州市| 铅山县| 静安区| 礼泉县| 怀宁县| 莎车县| 平江县| 连南| 赣州市| 连江县| 上林县| 甘泉县| 右玉县| 阜宁县| 东山县| 房产| 灵寿县| 榆社县| 大荔县| 榆社县| 灵寿县| 麟游县| 巴南区| 利津县| 东山县| 凤城市| 车险| 田阳县|