国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++編程中將引用類型作為函數參數的方法指南

C++編程中將引用類型作為函數參數的方法指南

2021-03-13 14:57C++教程網 C/C++

這篇文章主要介紹了C++編程中將引用類型作為函數參數的方法指南,是C++入門學習中的基礎知識,需要的朋友可以參考下

有了變量名,為什么還需要一個別名呢?C++之所以增加引用類型, 主要是把它作為函數參數,以擴充函數傳遞數據的功能。

到目前為止我們介紹過函數參數傳遞的兩種情況。

1) 將變量名作為實參和形參
這時傳給形參的是變量的值,傳遞是單向的。如果在執行函數期間形參的值發生變化,并不傳回給實參。因為在調用函數時,形參和實參不是同一個存儲單元。

【例】要求將變量i和j的值互換。下面的程序無法實現此要求。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main( )
{
  void swap(int,int); //函數聲明
  int i=3,j=5;
  swap(i,j); //調用函數swap
  cout<<i<<" "<<j<<endl; //i和j的值未互換
  return 0;
}
void swap(int a,int b) //企圖通過形參a和b的值互換,實現實參i和j的值互換
{
  int temp;
  temp=a; //以下3行用來實現a和b的值互換
  a=b;
  b=temp;
}

運行時輸出3 5i和j的值并未互換。

為了解決這個問題,采用傳遞變量地址的方法。
C++編程中將引用類型作為函數參數的方法指南
2) 傳遞變量的指針
形參是指針變量,實參是一個變量的地址,調用函數時,形參(指針變量)指向實參變量單元。程序見例6.19。

【例】使用指針變量作形參,實現兩個變量的值互換。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main( )
{
  void swap(int *,int *);
  int i=3,j=5;
  swap(&i,&j); //實參是變量的地址
  cout<<i<<" "<<j<<endl; //i和j的值已互換
  return 0;
}
void swap(int *p1,int *p2) //形參是指針變量
{
  int temp;
  temp=*p1; //以下3行用來實現i和j的值互換
  *p1=*p2;
  *p2=temp;
}

形參與實參的結合見圖示意。
C++編程中將引用類型作為函數參數的方法指南
這種虛實結合的方法仍然是“值傳遞”方式,只是實參的值是變量的地址而已。通過形參指針變量訪問主函數中的變量(i和j),并改變它們的值。這樣就能得到正確結果,但是在概念上卻是兜了一個圈子,不那么直截了當。

在Pascal語言中有“值形參”和“變量形參”(即var形參),對應兩種不同的傳遞方式,前者采用值傳遞方式,后者采用地址傳遞方式。在C語言中,只有“值形參”而無“變量形參”,全部采用值傳遞方式。C++把引用型變量作為函數形參,就彌補了這個不足。

C++提供了向函數傳遞數據的第(3)種方法,即傳送變量的別名。

【例】利用“引用形參”實現兩個變量的值互換。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int main( )
{
  void swap(int &,int &);
  int i=3,j=5;
  swap(i,j);
  cout<<"i="<<i<<" "<<"j="<<j<<endl;
  return 0;
}
void swap(int &a,int &b) //形參是引用類型
{
  int temp;
  temp=a;
  a=b;
  b=temp;
}

輸出結果為:

?
1
i=5 j=3


在swap函數的形參表列中聲明a和b 是整型變量的引用。
C++編程中將引用類型作為函數參數的方法指南
實際上,在虛實結合時是把實參i的地址傳到形參a,使形參a的地址取實參i的地址,從而使a和i共享同一單元。同樣,將實參j的地址傳到形參b,使形參b的地址取實參j的地址,從而使b和j共享同一單元。這就是地址傳遞方式。為便于理解,可以通俗地說:把變量i的名字傳給引用變量a,使a成為i的別名。

請思考:這種傳遞方式和使用指針變量作形參時有何不同?可以發現:使用引用類型就不必在swap函數中聲明形參是指針變量。指針變量要另外開辟內存單元,其內容是地址。而引用變量不是一個獨立的變量,不單獨占內存單元,在例中引用變量a和b的值的數據類型與實參相同,都是整型。
在main函數中調用swap函數時,實參不必用變量的地址(在變量名的前面加&),而直接用變量名。系統向形參傳送的是實參的地址而不是實參的值。
這種傳遞方式相當于Pascal語言中的“變量形參”,顯然,這種用法比使用指針變量簡單?直觀?方便。使用變量的引用,可以部分代替指針的操作。有些過去只能用指針來處理的問題,現在可以用引用來代替,從而降低了程序設計的難度。

【例】對3個變量按由小到大的順序排序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
int main( )
{
  void sort(int &,int &,int &); //函數聲明,形參是引用類型
  int a,b,c; //a,b,c是需排序的變量
  int a1,b1,c1; //a1,b1,c1最終的值是已排好序的數列
  cout<<"Please enter 3 integers:";
  cin>>a>>b>>c; //輸入a,b,c
  a1=a;b1=b;c1=c;           
  sort(a1,b1,c1); //調用sort函數,以a1,b1,c1為實參
  cout<<"sorted order is "<<a1<<" "<<b1<<" "<<c1<<endl; //此時a1,b1,c1已排好序
  return 0;
}
void sort(int &i,int &j,int &k) //對i,j,k 3個數排序
{
  void change(int &,int &); //函數聲明,形參是引用類型
  if (i>j) change (i,j); //使i<=j
  if (i>k) change (i,k); //使i<=k
  if (j>k) change (j,k); //使j<=k
}
void change (int &x,int &y) //使x和y互換
{
  int temp;
  temp=x;
  x=y;
  y=temp;
}

運行情況如下:

?
1
2
Please enter 3 integers:23 12 -345↙
sorted order is -345 12 23

可以看到:這個程序很容易理解,不易出錯。由于在調用sort函數時虛實結合使形參i,j,k成為實參a1,b1,c1的引用,因此通過調用函數sort(a1, b1, c1)既實現了對i,j,k排序,也就同時實現了對a1,b1,c1排序。同樣,執行change (i, j)函數,可以實現對實參i和j的互換。

引用不僅可以用于變量,也可以用于對象。例如實參可以是一個對象名,在虛實結合時傳遞對象的起始地址。這會在以后介紹。

當看到&a這樣的形式時,怎樣區別是聲明引用變量還是取地址的操作呢?當&a的前面有類型符時(如int &a),它必然是對引用的聲明;如果前面無類型符(如cout<<&a),則是取變量的地址。

延伸 · 閱讀

精彩推薦
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
主站蜘蛛池模板: 国产综合区 | 成人区精品一区二区婷婷 | 精品久久久一区 | 九九热精品视频在线免费观看 | 九九九九国产 | www.avtt天堂网 | 精品视频在线播放 | 国产羞羞视频在线观看 | 中文字幕免费视频 | 99re国产 | 日韩精品一区二区三区在线 | 成人免费观看cn | 日本高清视频在线 | 国产中文久久 | 精品欧美乱码久久久久久 | 午夜私人影院在线观看 | 欧美一区二区三区在线观看视频 | 中文字幕四虎 | 亚洲综合在线一区 | 亚洲国产精品尤物yw在线观看 | 日韩精品一区二区在线观看 | 久久久久久亚洲 | 日韩亚洲 | 91免费黄色片 | 日韩免费网站 | 在线观看亚洲一区二区三区 | 中文字幕一区二区在线观看 | 91高清在线观看 | 狠狠综合久久av一区二区老牛 | 国产资源在线观看视频 | 99精品国产高清一区二区麻豆 | 亚洲免费在线观看 | 成人欧美一区二区三区在线播放 | 欧美色欧美亚洲另类七区 | 国产精品综合在线 | 99国产一区| k8久久久一区二区三区 | 一级黄色片aaa | 欧美日韩中文 | 69久久久| 日韩色影|