在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]
所以得出结论:
得出结论:按值传递,不会改变当前调用函数里实参,按引用传值,会改变调用里面实参。
按值传递,这种方式,可以保护实参不被修改,效率比较低。
按引用传值或按引用传值,本质是传递一个指针指向地址值,实参会发生修改,效率更高。