關於C++裡面的函式中,按值傳遞與按引用傳遞的區別
阿新 • • 發佈:2019-01-28
在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]
所以得出結論:
得出結論:按值傳遞,不會改變當前呼叫函式裡實參,按引用傳值,會改變呼叫裡面實參。
按值傳遞,這種方式,可以保護實參不被修改,效率比較低。
按引用傳值或按引用傳值,本質是傳遞一個指標指向地址值,實參會發生修改,效率更高。