1.
引用
引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。(引用变量与已定义的变量地址相同(无论值是否被修改))
格式:类型 &引用变量名 = 已定义变量名;
特点:1)一个变量可取多个别名。
2)引用必须初始化。
3)引用只能在初始化时引用一次,不能改变为再引用其他的变量。
2.
const引用(常引用)
格式:const 类型 &引用变量名 = 已定义变量名;
特点:1)修改已定义变量名的值,则引用变量名的值也会改变。
2)不能给引用变量名赋值(不能给常量赋值)。
3)常量具有常性,只有常引用可以引用常量。(const &d = 6)
4)不同类型间不可直接引用(报错:无法用“类型名”类型的值初始化“类型名 &”类型的引用(非常量限定)),应在前以const修饰。
3.
传参方式
1)[值传递] 若形参为非引用的传值方式,则生成局部临时变量接受实参的值。(若要改变实参的值,则该操作无效)
void Swap(int left, int right)
{
int temp = left;
left = right;
right = temp;
} //无法交换left、right的值
2)[引用传递] 若形参为引用类型,则形参是实参的别名。
当不希望函数内改变参数的值时,尽量使用常引用传参。
void Swap(int &left, int &right)
{
int temp = left;
left = right;
right = temp;
} //可交换left、right的值
3)[指针传递]
void Swap(int *left, int *right)
{
int temp = *left;
*left = *right;
*right = temp;
}
4.
返回值
1)传值作返回值
int Add(int num1, int num2)
{
int ret = num1 + num2;
return ret;
}
2)传引用作返回值
int& Add(int num1, int num2)
{
int ret = num1 + num2;
return ret;
}
//警告:返回局部变量或临时变量的地址
3)传指针作返回值
int* Add(int* num, int n)
{
int *a;
for(int i=0; i<n; i++)
{
a[i] = num[i];
}
return a;
}
注意:不要返回一个临时变量的引用。
若返回对象出了当前函数的作用域依旧存在,则最好使用引用返回,因为这样更高效。
5.
引用与指针的区别与联系
1)引用只能在定义时初始化1次,之后不能改变指向其他变量(即从一而终);指针变量的值可变。
2)引用必须指向有用的变量;指针可以为空。
3)sizeof(指针对象)与sizeof(引用对象)的意义不一样。sizeof(指针对象)得到的是对象地址的大小,sizeof(引用对象)得到的是所指变量的大小。
4)指针和引用自增(++)/自减(--)的意义不一样。指针自增(++)/自减(--)的是对象地址的大小,引用自增(++)/自减(--)的是所指变量的大小。
5)相对而言,引用比指针更安全。
注意:指针比引用更灵活,但也更危险。
使用指针时一定要注意检查指针是否为空。指针所指的地址释放后最好置NULL,否则可能存在野指针问题。