一,引用变量
C++新增了一种复合类型--引用变量。引用是已定义变量的别名,使用引用变量的主要的用途是作为函数的参数。通过将引用变量用作参数,通过形参就可以对原始的数据进行修改。这样除指针之外,引用也为函数处理class与struct提供了一种非常方便的途径。
二,声明引用变量
C与C++使用&来获取变量的地址。C++给&赋予了另外一个含义,将其用来声明引用。
int num = 20;
int &re = num;
注意:必须在声明引用变量时进行初始化。下面的做法将导致编译错误:
int num = 20;
int &re;
re = num;
三,将引用用作函数的参数
引用常被用作函数的参数,使得函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法称为按引用传递,按引用传递允许被调用的函数能够访问调用函数中的变量。C++新增的这种特性也是对C语言的超越,C语言只能按值传递,按值传递导致被调用函数使用调用函数的值的拷贝。
#include <iostream>
using namespace std;
void Swap(int &x, int &y){
int temp = x;
x = y;
y = temp;
}
int main(){
int a = 5, b = 10;
Swap(a, b);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
四,将引用用于类对象
引用非常适合用于结构与类,C++中引入引用的主要目的是为了这些类型的,而不是基本的内置类型。将类对象传递给函数时,C++的通常的做法是使用引用。下面是我们自定义的类
class Person{
private:
string name;
int age;
public:
Person();
Person(const string &name, int age);
Person(const Person &obj);
Person & operator=(const Person &obj);
};
Person::Person(){
name = "default";
age = 0;
}
Person::Person(const string &name, int age){
this->name = name;
this->age = age;
}
Person::Person(const Person &obj){
name = obj.name;
age = obj.age;
cout<<"拷贝构造函数"<<endl;
}
Person & Person::operator=(const Person &obj){
if(this == &obj){
return *this;
}
name = obj.name;
age = obj.age;
cout<<"赋值构造函数"<<endl;
return *this;
}
1,使用引用作为函数的参数,比直接传递对象,节省时间和内存
定义两个函数,函数的功能是输出对象的内容,一个传递引用,另一个直接传递对象
void displayByReference(Person &obj){
}
void displayByObject(Person obj){
}
输出结果
拷贝构造函数
Process return 0;
调用displayByObject函数直接传递对象,会使用Person类的拷贝构造函数获取实参对象的副本,形参对象的生命周期结束时,还会调用它的析构函数。
2,将引用作为函数的参数返回
传统的返回机制与按值传递函数参数类似:计算关键字return后面的表达式,并将结果返回给调用函数。从概念上说,这个值被复制到一个临时的位置,而调用程序将使用这个值。例如:
Person P = getObject();
如果getObject函数返回一个类对象,将把整个对象复制到一个临时的位置,再将这个拷贝复制给P。但如果函数的返回值为引用,将直接把引用复制到P,后者效率更高。
注意:返回引用时,应避免返回局部对象的引用。