亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++編程中向函數傳遞引用參數的用法

2020-05-23 14:09:13
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了詳解C++編程中向函數傳遞引用參數的用法,包括使函數返回引用類型以及對指針的引用,需要的朋友可以參考下
 

引用類型的函數參數
向函數傳遞引用而非大型對象的效率通常更高。 這使編譯器能夠在保持已用于訪問對象的語法的同時傳遞對象的地址。 請考慮以下使用了 Date 結構的示例:

// reference_type_function_arguments.cppstruct Date{short DayOfWeek;short Month;short Day;short Year;};// Create a Julian date of the form DDDYYYY// from a Gregorian date.long JulianFromGregorian( Date& GDate ){static int cDaysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31  };long JDate = 0;// Add in days for months already elapsed.for ( int i = 0; i < GDate.Month - 1; ++i )JDate += cDaysInMonth[i];// Add in days for this month.JDate += GDate.Day;// Check for leap year.if ( GDate.Year % 100 != 0 && GDate.Year % 4 == 0 )JDate++;// Add in year.JDate *= 10000;JDate += GDate.Year;return JDate;}int main(){}

前面的代碼顯示通過引用傳遞的結構的成員是通過成員選擇運算符 (.) 訪問的,而不是通過指針成員選擇運算符 (–>) 訪問的。
盡管作為引用類型傳遞的參數遵循了非指針類型的語法,但它們仍然保留了指針類型的一個重要特征:除非被聲明為 const,否則它們是可以修改的。 由于上述代碼的目的不是修改對象 GDate,因此更合適的函數原型是:

long JulianFromGregorian( const Date& GDate );

此原型將確保函數 JulianFromGregorian 不會更改其參數。
任何其原型采用引用類型的函數都能接受其所在位置的相同類型的對象,因為存在從 typename 到 typename& 的標準轉換。

引用類型函數返回
可將函數聲明為返回引用類型。 做出此類聲明原因有:

  • 返回的信息是一個返回引用比返回副本更有效的足夠大的對象。
  • 函數的類型必須為左值。
  • 引用的對象在函數返回時不會超出范圍。

就像通過引用傳遞大型對象 to 函數或返回大型對象 from 函數可能更有效。 引用返回協議使得不必在返回前將對象復制到臨時位置。

當函數的計算結果必須為左值時,引用返回類型也可能很有用。 大多數重載運算符屬于此類別,尤其是賦值運算符。 重載運算符在重載運算符中有述。
示例
請考慮 Point 示例:

// refType_function_returns.cpp// compile with: /EHsc#include <iostream>using namespace std;class Point{public:// Define "accessor" functions as// reference types.unsigned& x();unsigned& y();private:// Note that these are declared at class scope:unsigned obj_x; unsigned obj_y; };unsigned& Point :: x(){return obj_x;}unsigned& Point :: y(){return obj_y;}int main(){Point ThePoint;// Use x() and y() as l-values.ThePoint.x() = 7;ThePoint.y() = 9;// Use x() and y() as r-values.cout << "x = " << ThePoint.x() << "/n"<< "y = " << ThePoint.y() << "/n";}

輸出

 x = 7y = 9

請注意,函數x 和 y 被聲明為返回引用類型。 這些函數可在賦值語句的每一端上使用。
另請注意在 main 中,ThePoint 對象停留在范圍中,因此其引用成員仍處于活動狀態,可以安全地訪問。
除以下情況之外,引用類型的聲明必須包含初始值設定項:

  • 顯式 extern 聲明
  • 類成員的聲明
  • 類中的聲明
  • 函數的參數或函數的返回類型的聲明

返回局部變量地址時的注意事項

如果在局部范圍中聲明某個對象,則該對象會在函數返回時銷毀。 如果函數返回對該對象的引用,則當調用方嘗試使用 null 引用時,該引用可能會在運行時導致訪問沖突。

// C4172 means Don't do this!!!Foo& GetFoo(){  Foo f;  ...  return f;} // f is destroyed here

編譯器會在這種情況下發出警告:警告 C4172: 返回局部變量或臨時變量的地址。 在簡單程序中,如果調用方在覆蓋內存位置之前訪問引用,則有時可能不會發生訪問沖突。 這純屬運氣。 請注意該警告。

對指針的引用
聲明對指針的引用的方式與聲明對對象的引用差不多。聲明對指針的引用將生成一個可像常規指針一樣使用的可修改值。
以下代碼示例演示了使用指向指針的指針與使用對指針的引用之間的差異。
函數 Add1 和 Add2 在功能上是等效的(雖然它們的調用方式不同)。二者的差異在于,Add1 使用雙間接尋址,而 Add2 利用了對指針的引用的便利性。

// references_to_pointers.cpp// compile with: /EHsc#include <iostream>#include <string>// STL namespaceusing namespace std;enum {  sizeOfBuffer = 132};// Define a binary tree structure.struct BTree {  char *szText;  BTree *Left;  BTree *Right;};// Define a pointer to the root of the tree.BTree *btRoot = 0;int Add1( BTree **Root, char *szToAdd );int Add2( BTree*& Root, char *szToAdd );void PrintTree( BTree* btRoot );int main( int argc, char *argv[] ) {  // Usage message  if( argc < 2 ) {   cerr << "Usage: Refptr [1 | 2]" << "/n";   cerr << "/nwhere:/n";   cerr << "1 uses double indirection/n";   cerr << "2 uses a reference to a pointer./n";   cerr << "/nInput is from stdin./n";   return 1;  }  char *szBuf = new char[sizeOfBuffer];  if (szBuf == NULL) {   cerr << "Out of memory!/n";   return -1;  }  // Read a text file from the standard input device and  // build a binary tree.  //while( !cin.eof() )   {   cin.get( szBuf, sizeOfBuffer, '/n' );   cin.get();   if ( strlen( szBuf ) ) {     switch ( *argv[1] ) {      // Method 1: Use double indirection.      case '1':        Add1( &btRoot, szBuf );        break;      // Method 2: Use reference to a pointer.      case '2':        Add2( btRoot, szBuf );        break;      default:        cerr << "Illegal value '"         << *argv[1]         << "' supplied for add method./n"           << "Choose 1 or 2./n";        return -1;     }   }  }  // Display the sorted list.  PrintTree( btRoot );}// PrintTree: Display the binary tree in order.void PrintTree( BTree* MybtRoot ) {  // Traverse the left branch of the tree recursively.  if ( btRoot->Left )   PrintTree( btRoot->Left );  // Print the current node.  cout << btRoot->szText << "/n";  // Traverse the right branch of the tree recursively.  if ( btRoot->Right )   PrintTree( btRoot->Right );}// Add1: Add a node to the binary tree.//    Uses double indirection.int Add1( BTree **Root, char *szToAdd ) {  if ( (*Root) == 0 ) {   (*Root) = new BTree;   (*Root)->Left = 0;   (*Root)->Right = 0;   (*Root)->szText = new char[strlen( szToAdd ) + 1];   strcpy_s((*Root)->szText, (strlen( szToAdd ) + 1), szToAdd );   return 1;  }  else {   if ( strcmp( (*Root)->szText, szToAdd ) > 0 )     return Add1( &((*Root)->Left), szToAdd );   else     return Add1( &((*Root)->Right), szToAdd );  }}// Add2: Add a node to the binary tree.//    Uses reference to pointerint Add2( BTree*& Root, char *szToAdd ) {  if ( Root == 0 ) {   Root = new BTree;   Root->Left = 0;   Root->Right = 0;   Root->szText = new char[strlen( szToAdd ) + 1];   strcpy_s( Root->szText, (strlen( szToAdd ) + 1), szToAdd );   return 1;  }  else {   if ( strcmp( Root->szText, szToAdd ) > 0 )     return Add2( Root->Left, szToAdd );   else     return Add2( Root->Right, szToAdd );  }}

用法:Refptr [1 | 2]

其中:
1 使用雙間接尋址
2 使用對指針的引用。輸入來自 stdin。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产va免费精品高清在线观看| 欧美人与性动交| 欧美一级片免费在线| 亚洲欧美日韩一区二区三区在线| 欧美xxxx14xxxxx性爽| 91九色蝌蚪国产| 26uuu另类亚洲欧美日本老年| 一区二区欧美久久| 亚洲成人黄色网| 欧美黄色免费网站| 欧美精品福利视频| 国产免费亚洲高清| 日韩综合中文字幕| 深夜福利亚洲导航| 国产91九色视频| 日韩精品免费在线视频观看| 亚洲国产天堂久久综合网| 亚洲精品视频网上网址在线观看| 78色国产精品| 日韩电影大片中文字幕| 51视频国产精品一区二区| 88xx成人精品| 一本大道香蕉久在线播放29| 97人人爽人人喊人人模波多| 国产精品久久久精品| 久久久久久久久亚洲| 国产丝袜一区二区三区| 成人久久久久久久| 伊人久久免费视频| 亚洲第五色综合网| 亚洲午夜av久久乱码| 最近2019中文字幕第三页视频| 久久久久久久久国产| 久久久久久高潮国产精品视| 久久久精品国产网站| 欧美丝袜一区二区三区| 奇米影视亚洲狠狠色| 欧美人与性动交| 九九热精品在线| 国产成人精品网站| 色七七影院综合| 国产精品一区二区三区久久| 亚洲欧洲中文天堂| 久久精品国产清自在天天线| 91国偷自产一区二区三区的观看方式| 亚洲午夜精品久久久久久久久久久久| 97精品欧美一区二区三区| 亚洲激情 国产| 日韩精品福利网站| 欧美性黄网官网| 久久久免费av| 一本色道久久综合狠狠躁篇的优点| 中文字幕亚洲无线码a| 亚洲精品中文字| 九九热精品视频国产| 懂色av中文一区二区三区天美| 欧美日韩一区免费| 亚洲国产精品va在线观看黑人| 日韩综合中文字幕| 亚洲成色777777在线观看影院| 欧美—级高清免费播放| 欧美精品一区二区三区国产精品| 成人欧美一区二区三区在线| 国产精品高清在线观看| 亚洲国产小视频在线观看| 亚洲黄色www| 成人亚洲欧美一区二区三区| 欧美日韩在线视频首页| 国产+成+人+亚洲欧洲| 欧美激情va永久在线播放| 亚洲人成网站免费播放| 久久精品成人一区二区三区| 在线观看成人黄色| 成人深夜直播免费观看| 欧美成人免费大片| 午夜美女久久久久爽久久| 成人a视频在线观看| 欧美视频免费在线观看| 国产精品免费视频久久久| 九九热精品视频在线播放| 日韩精品高清在线观看| 亚洲精选中文字幕| 中文字幕欧美日韩在线| 亚洲欧美日韩精品| 国产91网红主播在线观看| 久久精品国产亚洲精品2020| 欧美视频在线免费| 色偷偷偷综合中文字幕;dd| 国产美女91呻吟求| 久久久久久九九九| 亚洲精品国精品久久99热一| 精品久久久久久国产| 91九色国产视频| 久久久亚洲福利精品午夜| 日韩电影在线观看中文字幕| 亚洲欧美另类中文字幕| 欧美日韩免费区域视频在线观看| 亚洲国产精品高清久久久| 国产精品亚洲片夜色在线| 国产亚洲人成网站在线观看| 亚洲午夜精品久久久久久久久久久久| 久久精品国产91精品亚洲| 久久av红桃一区二区小说| 一区二区三区四区在线观看视频| 久久免费国产视频| 九九久久综合网站| 精品久久在线播放| 国产999精品久久久| 欧美孕妇孕交黑巨大网站| 亚洲系列中文字幕| 伦伦影院午夜日韩欧美限制| 亚州精品天堂中文字幕| 欧美乱大交xxxxx另类电影| 亚洲电影中文字幕| 国产精品一久久香蕉国产线看观看| 日韩欧美亚洲成人| 北条麻妃一区二区在线观看| 国产精品一区二区三区毛片淫片| 久久精品青青大伊人av| 中文字幕久热精品视频在线| 日韩av片免费在线观看| 国产剧情日韩欧美| 精品丝袜一区二区三区| 91精品中国老女人| 久久亚洲一区二区三区四区五区高| 日韩有码在线视频| 亚洲国产精品女人久久久| 国产一区二区久久精品| 色久欧美在线视频观看| 亚洲精品电影久久久| 91久久精品国产| 国产日韩av在线播放| 亚洲欧美一区二区三区四区| 亚洲精品国产精品久久清纯直播| 成人福利视频在线观看| 91在线播放国产| 国产a∨精品一区二区三区不卡| 日韩成人久久久| 欧美激情二区三区| 91久久久久久久久久久| 欧美另类高清videos| 91免费福利视频| 中文字幕日韩综合av| 最近2019年日本中文免费字幕| 欧美日韩成人精品| 亚洲免费人成在线视频观看| 欧美老女人性视频| 亚洲视频欧洲视频| 欧美激情xxxx| 欧美日韩国产第一页| 4438全国亚洲精品在线观看视频| 国产v综合ⅴ日韩v欧美大片| 亚洲欧美制服丝袜| 欧美激情伊人电影| 日本免费在线精品| 欧洲成人免费aa| 欧美日韩激情视频8区| 欧美午夜宅男影院在线观看| 欧美成人免费一级人片100| 国产精品久久久久久av福利软件| 成人网在线观看| 中文字幕久久亚洲| 欧美激情亚洲综合一区| 欧美第一淫aaasss性|