C++参数传递

来源:互联网 发布:佛山市软件行业协会 编辑:程序博客网 时间:2024/06/15 18:24

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;}

运行结果:



可以发现,不管是基本数据类型,对象,还是指针都是指传递,除非声明了引用,进行引用传递。

0 0
原创粉丝点击