函数传参的三种类型
1,对象传参
函数声明
void fuc(A a);
调用方法:
A b;
fuc(b); //调用时会先进行将实参的值赋给形参的操作,函数内不会改变实参b的状态
2, 指针传参
函数声明
void fuc(A* a);
调用方法:
A b;
fuc(&b); //调用时也会先进行将实参指针赋给形参指针的操作,但由于传的是地址,形参的*a实际也指向b,因此函数内会改变实参b的状态
3, 引用传参
函数声明:
void fuc(A& a);
&在函数声明中表示引用,其他位置一般表示取地址。
调用方法:
A b;
fuc(b); //直接引用实参,不会生成形参,因此省略了赋值操作这一步。函数会直接对实参进行操作,因此会改变实参的值
补充:const和*&
1,有const修饰时
有时会有 void fuc(const A& a); 这种函数声明的写法,这样的好处是:既不想在函数中变实参,又可以省略形参实参赋值的消耗。
如果一个变量在声明时就被const修饰:
如:
const A b;
这样对于 void fuc(A& a); 的声明,就无法 fuc(b); 调用,因为const要求b无法改变,因此b不能进行引用传参。
2,void fuc( A*& a); 这种声明表示什么?
还是引用传参,只不过实参是个A类型指针:
调用:
A* b;
fuc(b);