1. 程式人生 > >關於C++裡面的函式中,按值傳遞與按引用傳遞的區別

關於C++裡面的函式中,按值傳遞與按引用傳遞的區別

在c++中,一般有兩種傳遞方式:一種是引用按值傳遞,另一種是按引用傳值,
其我們經常在java中寫一些方法呼叫,當傳遞基本型別時,都是按指傳遞,在
傳遞物件時,都是按引用型別傳遞。

那麼這兩種的方式,我舉個例子如下:

#include <iostream>
#include <cstring>
using namespace std;

struct Student
{
    char name[20];
    int age ;
    char sex;
    int grade;

};

void changeMsg(Student);  //按值傳遞,
void changeMsg1(Student &); //引用傳遞; void changeMsg2(Student *stu);//指標傳值; int main(int argc, char const *argv[]) { Student stu={"old name0",18,'f',3}; cout<<"改變前:"<<stu.name<<"\t"<<stu.age<<"\t"<<stu.sex<<"\t"<<stu.grade<<endl; changeMsg(stu); cout
<<"changeMsg:"<<stu.name<<"\t"<<stu.age<<"\t"<<stu.sex<<"\t"<<stu.grade<<endl; changeMsg1(stu); cout<<"changeMsg1:"<<stu.name<<"\t"<<stu.age<<"\t"<<stu.sex<<"\t"<<stu.grade<<endl; changeMsg2(&stu); cout
<<"changeMsg2:"<<stu.name<<"\t"<<stu.age<<"\t"<<stu.sex<<"\t"<<stu.grade<<endl; return 0; } void changeMsg(Student stu) { strcpy(stu.name,"new name"); stu.age=20; stu.sex='m'; stu.grade=4; } void changeMsg1(Student &stu) { strcpy(stu.name,"new name1"); stu.age=20; stu.sex='m'; stu.grade=4; } void changeMsg2(Student *stu) { strcpy(stu->name,"new name2"); stu->age=34; stu->sex='f'; stu->grade=3; }

在控制檯輸出結果:

改變前:old name0   18  f   3
changeMsg:old name0 18  f   3
changeMsg1:new name1    20  m   4
changeMsg2:new name2    34  f   3
[Finished in 0.4s]

所以得出結論:


 得出結論:按值傳遞,不會改變當前呼叫函式裡實參,按引用傳值,會改變呼叫裡面實參。
 按值傳遞,這種方式,可以保護實參不被修改,效率比較低。
 按引用傳值或按引用傳值,本質是傳遞一個指標指向地址值,實參會發生修改,效率更高。