引用说明:
引用的时候需要在定义的时候初始化
&在此不是求地址运算,而是起标识作用。
类型标识符是指目标变量的类型。
声明引用时,必须同时对其进行初始化。
声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元。
1、引用作为参数
char c;
char *p = &c;//指针
char& r = c;//引用
r是c的别名,用r和用f是一样的
在参数表里,或者作为成员变量可以不初始化,但是如果是本地变量或者是全局变量,必须初始化
2、常引用
const int& z = x;
代表z是x的别名,但是不能通过z改变x的值
3、引用作为返回值
以引用返回函数值,定义函数时需要在函数名前加&
用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
int& h()
{
int q;
return x;
}
h() = 16;
如果要从函数里返回一个引用,写在return那里的是一个变量,且本地变量不行(生命周期太短)。
4、引用和多态
class A
{
public:
int& m_y;
A(int& a);
};
A::A(int& a) :m_y(a)
{
}
如果要在一个类里面定义一个引用的变量,则必须用构造函数初始化,不能在花括号里
void func(const int& y,int& z)
{
z = z*5;
z += 8;
}
const引用传进函数里,可以减少数据的传递,且不改变里面的值。
void func(int &)
fun(i*3);//error
函数里需要传进去一个能做左值的变量,i*3会被自动默认成const,但是如果函数里面是const就可以编译通过
#include <iostream>
using namespace std;
class A
{
public:
int i;
A() : i(0) {};
~A(){};
};
A& f()
{
A a;
return a;
}
int main()
{
A b;
b.i = 20;
f() = b;
}
返回的a对象时本地变量,会被释放。所以下面的代码无意义