以下内容包括引用的五点:
1.引用与指针的区别与联系
2.普通引用(&p)与指针(*p)做函数参数(目的是将变量的地址传递给调用函数)
3.函数的返回值为引用的两种接收问题
4.当返回的引用是静态变量或者全局变量时的做左值和右值问题
5.普通引用与常引用的初始化方式与区别
--------1.--------引用与指针的区别与联系
c++的引用就是相当于简化的指针传递地址的操作,在c语言中,我们需要创建指针:类型 *变量名=NULL;然后通过&符取地址传递给指针变量。而引用是简化了取地址这一步,创建一个引用:类型& 变量名=其他同类型变量,此时,其他变量的地址隐藏的传递给了引用变量。
void main()
{
//引用的格式就是: 类型名称& 新的变量名称 = 原名称 ;引用的本质是一个常量的内存地址: 类型名称 *const 新的名称
int a = 10;
int &b = a;//引用。b就是a,a就是b。其实是内存地址的赋予
b = 20;
cout << "b=" << b << endl;//b=20
int* c = &a;//指针传递
cout << *c << endl;//将地址内容转成数据
}
--------2.--------普通引用与引用做参数:
普通引用必须初始化,引用做参数就不需要初始化
//普通引用时,变量必须初始化
void main()
{
int a;
//int &b;//普通引用时,变量必须初始化,即&b必须=一个变量;如果不初始化就相当于指针没有初始化,变成了野指针
//cout << "b=" << b << endl;
}
//引用做函数参数声明时,可以不进行变量初始化
void change1(int a, int b)//这样的交换并不能交换数的本体,交换的只是a和b的值而并非x、y的值
{
int c;
c = a;
a = b;
b = c;
}
void change2(int *a, int *b)//&表示的是取变量地址,a,b表示这个变量的地址。*a,*b表示的是这个地址变量的值,change2就是交换了变量的地址,所以可以交换x、y的数据
{
int c;
c = *a;
*a = *b;
*b = c;
}
void change3(int &a,int &b)//引用做参数声明时,可以不用初始化。引用变量就是内存地址的交换,a就是x,x就是a
{
int c;
c = a;
a = b;
b = c;
}
void main()
{
int x = 10,y = 20 ;
change1(x, y);//值传递,因为change1并没有值返回,所以x和y的值并没有交换
printf("x=%d,y=%d\n",x,y);//x=10,y=20
change2(&x, &y);//change2将x和y的地址传递给形参指针,因为地址指向的内容发生了改变,所以x和y也发生了交换
printf("x=%d,y=%d\n", x, y);//x=20,y=10
x = 100, y = 200;
change3(x, y);//change3将变量x和y传递给形参引用,就相当于change2传递给指针,只是不需要在传递的时候用&符取地址传递
printf("x=%d,y=%d\n", x, y);//x=200,y=100
}
--------3.--------函数的返回值是引用有两种情况去接收:
1.当用一个变量去接收时,变量得到返回的引用值
2.当用一个引用去接收时,引用变量得到的是返回引用变量的地址
int function1()//返回一个值
{
int a = 0;
a++;
return a;
}
int& function2()//返回一个引用(因为引用就是变量的一个替身)
{
int a = 0;
a++;
return a;
}
void main()
{
int a1 = function1();//将值赋给变量(得到a的值)
int a2 = function2();//将引用的值赋给变量(得到a的值)
int& a3 = function2();//将引用的值赋给引用(得到a的地址)
}
--------4.--------特殊情况,当引用是静态变量 或者是 全局变量可以作为右值也可以作为左值
int& function4()//返回一个变量(因为引用就是变量的一个替身)
{
static int a = 0;
a++;
return a;
}
void main()
{
//作右值
int a2 = function4();//将引用的值赋给变量(得到a的值)
cout << "a2=" << a2 << endl;
//作左值
function4() = 200;
cout << function4()<< endl;
}
--------5.--------普通引用与常引用的初始化方式与区别
//常引用的知识架构,引用分为普通引用和常引用
void main()
{
//1.普通引用,是指将变量的所有属性均赋予给引用,
int a = 10;
int &b = a;
b = 20;//it is ok to change the a valve
printf("b:%d \n", b);
//2.常引用,是只将变量的只读属性赋予给引用,不能修改变量的初始值
int x = 20;
const int &y = x; //常引用 是 让变量 引用只读属性 不能通过y去修改x了
//其中,常引用的初始化方式分为2种情况
//<1> 用变量 初始化 常引用
{
int x1 = 30;
const int &y1 = x1; //用x1变量去初始化 常引用
}
//<2> 用字面量 初始化 常量引用
{
const int a = 40; //c++编译器把a放在符号表中
//其中,需要注意的一个问题就是,常引用可以用字面量来初始化,而普通引用不能直接使用字面量来初始化
{
//int &m = 41; 普通引用,引用一个字面量是不可以的,因为字面量有没有内存地址,而引用就是地址的一个别称。没有地址的字面量不能谈普通引用
const int &m = 43; //而常引用,c++编译器 会 分配内存空间给字面量,所以常引用的初始化可以用字面量来初始化
}
}
}