程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 舉例分析C++中援用的實質及援用作函數參數的應用

舉例分析C++中援用的實質及援用作函數參數的應用

編輯:關於C++

舉例分析C++中援用的實質及援用作函數參數的應用。本站提示廣大學習愛好者:(舉例分析C++中援用的實質及援用作函數參數的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例分析C++中援用的實質及援用作函數參數的應用正文


援用的意義與實質
1)援用作為其它變量的別號而存在,是以在一些場所可以取代指針
2)援用絕對於指針來講具有更好的可讀性和適用性

援用實質思慮:
思慮、C++編譯器面前做了甚麼任務?

#include <iostream> 
using namespace std; 
 
int main() 
{ 
  int a = 10; 
  // 零丁界說的援用時,必需初始化;解釋很像一個常量 
  int &b = a; 
  // b是a的別號 
  b = 11; 
  cout << "b--->" << a << endl; 
  printf("a:%d\n", a); 
  printf("b:%d\n", b);  
  printf("&a:%d\n", &a); 
  printf("&b:%d\n", &b); 
  system("pause"); 
  return 0; 
} 

援用是一個有地址,援用是常量。

char *const p

援用的實質:
1)援用在C++中的外部完成是一個常指針
Type& name <--> Type*const name
2)C++編譯器在編譯進程中應用常指針作為援用的外部完成,是以援用所占用的空間年夜小與指針雷同。
3)從應用的角度,援用會讓人誤解其只是一個體名,沒有本身的存儲空間。這是C++為了適用性而做出的細節隱蔽

直接賦值成立的三個前提:
1界說兩個變量(一個實參一個形參)
2樹立聯系關系實參取地址傳給形參
3*p形參去直接的修正實參的值

援用在完成上,只不外是把:直接賦值成立的三個前提的後兩步和二為一。
當實參傳給形參援用的時刻,只不外是c++編譯器幫我們法式員手工取了一個實參地址,傳給了形參援用(常量指針)。

援用做函數參數

通俗援用在聲明時必需用其它的變量停止初始化,
援用作為函數參數聲明時不停止初始化

//龐雜數據類型的援用 
#include <iostream> 
using namespace std; 
 
struct Teacher 
{ 
  char name[64]; 
  int age; 
}; 
 
void printfT(Teacher *pT) 
{ 
  cout << pT->age << endl; 
} 
 
//pT是t1的別號 ,相當於修正了t1 
void printfT2(Teacher &pT) 
{ 
  //cout<<pT.age<<endl; 
  pT.age = 33; 
} 
 
//pT和t1的是兩個分歧的變量 
void printfT3(Teacher pT) 
{ 
  cout << pT.age << endl; 
  pT.age = 45; //只會修正pT變量 ,不會修正t1變量 
} 
void main() 
{ 
  Teacher t1; 
  t1.age = 35; 
 
  printfT(&t1); 
 
  printfT2(t1); //pT是t1的別號 
  printf("t1.age:%d \n", t1.age); //33 
 
  printfT3(t1);// pT是形參 ,t1 copy一份數據 給pT   //---> pT = t1 
  printf("t1.age:%d \n", t1.age); //35 
 
  cout << "hello..." << endl; 
  system("pause"); 
  return; 
} 


援用的難點:函數前往值是援用(援用當左值)
當函數前往值為援用時,若前往棧變量,不克不及成為其它援用的初始值,不克不及作為左值應用;
若前往靜態變量或全局變量,可以成為其他援用的初始值,便可作為右值應用,也可作為左值應用。
C++鏈式編程中,常常用到援用。

#include <iostream> 
using namespace std; 
//前往值是基本類型,當援用 
int getAA1() 
{ 
  int a; 
  a = 10; 
  return a; 
} 
 
//基本類型a前往的時刻,也會有一個正本 
int& getAA2() 
{ 
  int a; // 假如前往棧上的援用,有能夠會有成績 
  a = 10; 
  return a; 
} 
 
int* getAA3() 
{ 
  int a; 
  a = 10; 
  return &a; 
} 
 
int main() 
{ 
  int a1 = 0; 
  int a2 = 0; 
 
  a1 = getAA1(); 
  a2 = getAA2(); // a是10 
  int &a3 = getAA2(); // 若前往棧變量,不克不及成為其他援用的初始值 
  cout << a1 << endl; 
  cout << a2 << endl; 
  cout << a3 << endl; // a3是亂碼,這裡湧現了成績 
  // 編譯器看到a3是個援用,主動停止對a3的地址停止取值 
  // 然則函數getAA2加入的時刻曾經釋放了這個地址的內存,所以這裡是亂碼 
 
  return 0; 
} 

前往值是static變量,當援用

//static潤飾變量的時刻,變量是一個狀況變量 
int j() 
{ 
  static int a = 10; 
  a++; 
  printf("a:%d \n", a); 
  return a; 
 
} 
 
int& j1() 
{ 
  static int a = 10; 
  a++; 
  printf("a:%d \n", a); 
  return a; 
} 
 
int *j2() 
{ 
  static int a = 10; 
  a++; 
  printf("a:%d \n", a); 
  return &a; 
} 
 
 
void main() 
{ 
  // j()的運算成果是一個數值,沒有內存地址,不克不及當左值 
  //11 = 100; 
  //*(a>b?&a:&b) = 111; 
  //當被挪用的函數當左值的時刻,必需前往一個援用 
  j1() = 100; //編譯器幫我們打造了情況 
  j1(); 
  *(j2()) = 200; //相當於手工的打造,做左值的前提 
  j2(); 
  system("pause"); 
} 

前往值是形參,當援用

int g1(int *p) 
{ 
  *p = 100; 
  return *p; 
} 
 
int& g2(int *p) // 
{ 
  *p = 100; 
  return *p; 
} 

//當應用援用語法的時刻 ,不去關懷編譯器援用是怎樣做的 
//當剖析亂碼這類景象的時刻,才去斟酌c++編譯器是怎樣做的。。。。 
void main() 
{ 
  int a1 = 10; 
  a1 = g2(&a1); 
 
  int &a2 = g2(&a1); //用援用去接收函數的前往值,是否是亂碼,症結是看前往的內存空間是否是被編譯器收受接管了。。。。 
  printf("a1:%d \n", a1); 
  printf("a2:%d \n", a2); 
 
  system("pause"); 
} 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved