您的位置:首页 > 编程语言 > C语言/C++

关于C++里面的函数中,按值传递与按引用传递的区别

2016-12-25 18:09 375 查看
在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]


所以得出结论:

得出结论:按值传递,不会改变当前调用函数里实参,按引用传值,会改变调用里面实参。
按值传递,这种方式,可以保护实参不被修改,效率比较低。
按引用传值或按引用传值,本质是传递一个指针指向地址值,实参会发生修改,效率更高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++