C++和Java、C#语言在参数传递的时候,最大的不同就是在 C++ 中,除非显式通过指针或引用传递,否则所有变量都通过值传递。在 C# 中,除非显式通过具有 ref 或 out 参数修饰符的引用传递,否则类通过引用传递,而结构通过值传递。Java中类通过引用传递,基本数据类型通过值传递。
具体说来:C++中每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。 形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名。 非引用形参表示对实参的局部副本。对这类形参的修改仅仅改变了局部副本的值。一旦函数执行结束,这些局部变量的值也就没有了。
下面通过实例进行验证:
定义一个Person类
头文件声明
#include <string>
using std::string;
class Person
{
private:
string name;
string gender;
int age;
public:
Person();
Person(string name, string gender, int age);
~Person();
string getName();
void setName(string name);
string getGender();
void setGender(string gender);
int getAge();
void setAge(int age);
void printInfo();
};
源文件定义
#include <iostream>
#include "person.h"
using namespace std;
Person::Person()
{
}
Person::Person( string name, string gender, int age )
{
this->name = name;
this->gender = gender;
this->age = age;
}
Person::~Person()
{
}
string Person::getName()
{
return this->name;
}
void Person::setName( string name )
{
this->name = name;
}
string Person::getGender()
{
return gender;
}
void Person::setGender( string gender )
{
this->gender = gender;
}
int Person::getAge()
{
return age;
}
void Person::setAge( int age )
{
this->age = age;
}
void Person::printInfo()
{
cout<<"Name:"<<this->name<<endl;
cout<<"Gender:"<<this->gender<<endl;
cout<<"Age:"<<this->age<<endl;
}
测试程序:
#include <iostream>
#include "person.h"
using std::cout;
using std::endl;
template <typename T>
//使用了模板的方法,用于两个数据的交互
void swap(T obj1, T obj2)
{
T temp;
temp = obj1;
obj1 = obj2;
obj2 = temp;
}
void swap(double *obj1, double *obj2)
{
double temp;
temp = *obj1;
*obj1 = *obj2;
*obj2 = temp;
}
int main()
{
double num1 = 12, num2 = 0;
cout<<"一般数据类型进行交换:"<<endl;
cout<<num1<<" "<<num2<<endl;
swap(num1,num2);
cout<<num1<<" "<<num2<<endl;
Person p1 = Person("tanzhenyu","male",24);
Person p2 = Person("zhoujielun","male",34);
cout<<"对象类型进行交换:"<<endl;
p1.printInfo();
p2.printInfo();
swap(p1,p2);
p1.printInfo();
p2.printInfo();
double *pnum1 = &num1, *pnum2 = &num2;
cout<<"指针类型进行交换(注意这里不是交换指针,而是交换指针指向的值):"<<endl;
cout<<num1<<" "<<num2<<endl;
swap(pnum1,pnum2);
cout<<num1<<" "<<num2<<endl;
Person &pn1 = p1, & pn2 = p1;
cout<<"引用类型进行交换:"<<endl;
pn1.printInfo();
pn2.printInfo();
swap(pn1,pn2);
pn1.printInfo();
pn2.printInfo();
return 0;
}
运行结果:
可以发现,不管是基本数据类型,对象,还是指针都是指传递,除非声明了引用,进行引用传递。