C++結構體作爲函數參數(值和引用)和返回值

結構作爲參數

我們在前面的一些章節中知道,變量作爲函數的參數,瞭解它是值傳遞還是地址傳遞是非常重要的。因爲這意味着參數在函數體內的修改是否會影響到該變量本身。

不同於數組,結構是按值傳遞的。也就是說整個結構的內容都複製給了形參,即使某些成員數據是一個數組。

下面,我們就以一個實例來證明這一點:(程序9.3.1)
#include "iostream.h"
struct student
{
   int idNumber;
   char name[15];
   int age;
   char department[20];
   float gpa;
};
void display(student arg);//結構作爲參數
int main()
{
   student s1={428004, "Tomato",20, "ComputerScience",84.5};//聲明s1,並對s1初始化
   cout <<"s1.name的地址" <<&s1.name <<endl;
   display(s1);
   cout <<"形參被修改後……" <<endl;
   display(s1);
   return 0;
}
void display(student arg)
{
   cout <<"學號:" <<arg.idNumber <<"姓名:" <<arg.name <<"年齡:" <<arg.age <<endl <<"院系:" <<arg.department <<"成績:" <<arg.gpa <<endl;
   cout <<"arg.name的地址" <<&arg.name <<endl;
   for (int i=0;i<6;i++)//企圖修改參數的成員數據
   {
      arg.name[i]='A';
   }
   arg.age++;
   arg.gpa=99.9f;
}
運行結果:
s1.name的地址0x0012FF54
學號:428004姓名:Tomato年齡:20
院系:ComputerScience成績:84.5
arg.name的地址0x0012FED8
形參被修改後……
學號:428004姓名:Tomato年齡:20
院系:ComputerScience成績:84.5
arg.name的地址0x0012FED8

通過上面這個程序,我們發現在函數中修改形參的值對實參是沒有影響的。並且通過輸出變量s1和參數arg的成員數據name所在地址,我們可以知道兩者是不相同的,即整個name數組也複製給了參數arg。

如果我們希望能在函數修改實參,則可以使用引用的方法。由於結構往往整合了許多的成員數據,它的數據量也絕對不可小覷。使用值傳遞雖然能夠保護實參不被修改,但是卻會或多或少地影響到程序的運行效率。所以,一般情況下,我們選擇引用傳遞的方法。

結構作爲返回值

一般情況下,函數只能返回一個變量。如果要嘗試返回多個變量,那麼就要通過在參數中使用引用,再把實參作爲返回值。然而,這種方法會導致一大堆參數,程序的可讀性也較差。
當結構出現以後,我們可以把所有需要返回的變量整合到一個結構中來,問題就解決了。我們通過一段程序來了解如何讓函數返回一個結構:(程序9.3.2)
#include "iostream.h"
struct student
{
   int idNumber;
   char name[15];
   int age;
   char department[20];
   float gpa;
};
student initial();//初始化並返回一個結構
void display(student arg);
int main()
{
   display(initial());//輸出返回的結構
   return 0;
}
void display(student arg)
{
   cout <<"學號:" <<arg.idNumber <<"姓名:" <<arg.name <<"年齡:" <<arg.age <<endl <<"院系:" <<arg.department <<"成績:" <<arg.gpa <<endl;
}
student initial()
{
   student s1={428004, "Tomato",20, "ComputerScience",84.5};//初始化結構變量
   return s1;//返回結構
}

運行結果:
學號:428004姓名:Tomato年齡:20
院系:ComputerScience成績:84.5
發佈了13 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章