一、函数的参数及其传递方式
C++的函数传递有两种传递方式:传值和伟引用。传值分为传“对象值”和“对象地址值”,“对象值”是指对象的数据成员值,“对象地址值”是指对象的首地址值。伟引用其实是传对象的地址。
注意:传地址值传递的是值,不是地址;传地址传的是地址,不是地址值。传递对象地址值是使用对象指针作为参数,传递对象地址是使用对象引用作为参数。
1、对象作为函数参数
将对象作为函数参数,是将实参对象的值传递给形参对象,这种传递是单向的。形参拥有实参的备份,当在函数中改变形参的值时,改变的是这个备份的值,不会影响原来实参的值,这种传值方式可以防止被调用的函数改变参数的原始值。
#include <iostream>
#include <string>
using namespace std;
void example1();
void swap1(string,string);//声明交换方法的函数原型
int main(){
example1();
return 0;
}
void example1(){
string s1("过去"),s2("现在");//定义对象s1和s2
cout << "交换之前:" << s1 << " " << s2 << endl;
swap1(s1,s2);//使用传值方式传递s1和s2的数据成员值
cout << "交换之后返回主函数:" << s1 << " " << s2 << endl;
/**
* 交换之前:过去 现在
* 交换之后:现在 过去
* 交换之后返回主函数:过去 现在
*/
}
void swap1(string s1,string s2){
string temp = s1;
s1 = s2;
s2 = temp;
cout << "交换之后:" << s1 << " " << s2 << endl;
};
2、对象指针作为函数参数
将指向对象的指针作为函数参数,形参是对象指针,实参是对象的地址值。虽然参数传递方式仍然是传值,但因为形参传递的就是实参本身,所以当在函数中改变形参的值时,改变的就是原来实参的值。传对象地址值要用到对象指针,常使用的传对象地址值的方式,如传递类或结构对象的地址值、传递数组名。
void example2();
void swap2(string *,string *);
int main(){
example2();
return 0;
}
void example2(){
string s1("过去"),s2("现在");
cout << "交换之前:" << s1 << " " << s2 << endl;
swap2(&s1,&s2);//使用传地址值的方式传递s1和s2的地址值
cout << "交换之后返回主函数:" << s1 << " " << s2 << endl;
/**
* 交换之前:过去 现在
* 交换之后:现在 过去
* 交换之后返回主函数:现在 过去
*/
}
void swap2(string *s1,string *s2){//string类的对象指针s1和s2作为参数
string temp = *s1;
*s1 = *s2;
*s2 = temp;
cout << "交换之后:" << *s1 << " " << *s2 << endl;