C++中的引用

引用的基本概念

变量名实质上是一段连续存储空间的别名,例如房间的门牌号,程序通过变量来申请并命名内存空并使用存储空间

引用可以看作一个已定义变量的别名

引用的语法:

type &name = var
int b=10;
int &a=b;

引用的使用:

void main1()
{
	int a = 2018; 
	int &b = a;
	b  = 2019; 
    printf("b:%d\n",b);
	printf("a:%d\n", a);
    printf("&a:%d\n",&a);
    printf("&b:%d\n",&b);
}


//程序输出:
b:2019
a:2019
&a:6422296
&b:6422296

由程序输出可见:b是a的引用,更新b也同时更新了a的值,因为a,b均指向统一内存空间。

引用的本质

因为引用必须要初始化,故引用类似于一个const

int &a=b;<=====>int * const a=&b;

即引用在C++中的内部实现是一个常指针,故引用占据的内存空间大小与指针相同:4字节

故虽然引用是别名,但是仍然有自己的存储空间

====>因此在编译的时候,编译器自动帮助我们对实际参数b取地址传给了常量指针a-即形参引用

引用的使用

引用做左值

当函数返回值为引用时

若返回栈变量

不能成为其它引用的初始值

不能作为左值使用

若返回静态变量或全局变量

可以成为其他引用的初始值

即可作为右值使用,也可作为左值使用

返回值是static做引用-代码实例:

int test1()
{
	static int a = 10;
	a ++;
	printf("a:%d \n", a);
	return a;
}

int& test2()
{
	static int a = 10;
	a ++;
	printf("a:%d \n", a);
	return a;
}

int *test3()
{
	static int a = 10;
	a ++;
	printf("a:%d \n", a);
	return &a;
}

int main()
{
	// test1()的运算结果是一个数值,没有内存地址,不能当左值
	//当被调用的函数当左值的时候,必须返回一个引用
	test2() = 100; //编译器实现做左值条件
	test2();
	*(test3()) = 200; //自己实现做左值的条件
	test3();
	return 0;
}

程序结果:
a:11
a:101
a:11
a:201

返回值是形式参数做引用-代码实例:

int&  test(int *p) 
{
	*p = 100;
	return *p;
}

int main()
{
    int a=10;
    //使用引用去接收函数的返回值,看返回的内存空间是否被编译器释放
    //这里:a的地址与test(&a)的地址时一样的,故还没有释放,可以做引用的右值
    int &b=test(&a); 
    return 0;
}

返回值是其他复杂类型做引用:========>以后更新

指针的引用-代码示例:

struct Teacher
{
	char name[64];
	int age;
};

int getTe(Teacher **myp )
{
	Teacher *p=NULL;
        p = (Teacher *)malloc(sizeof(Teacher));
	
	if (p ==NULL)
	{
		return -1;
	}
	p->age = 33;

	*myp  = p; 
	return 0;
}

int main()
{
	Teacher *p1 = NULL;
	getTe(&p1);
	printf("age:%d \n", p1->age);
	return 0;

}

以上函数的内存执行图:

 

指针引用:

int getTe2(Teacher*  &myp)
{
	myp = (Teacher *)malloc(sizeof(Teacher));
	myp->age = 34;
	return 0;
}

常引用-代码示例:让变量引用具有只读属性

//普通引用
int a = 10;
int &b = a;
//常量引用 :让变量引用只读属性
const int &c = a;  

//常量引用初始化 分为两种
    //1 用变量 初始化 常量引用
		int x = 20;
		const int& y = x;

    //2 用常量 初始化 常量引用
		//int &m = 10; //引用是内存空间的别名 字面量10没有内存空间 没有方法做引用
		const int &m = 10; 

常引用总结:

1)Const & int e  相当于 const int * const e

2)普通引用 相当于 int *const e1

3)当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

4)使用字面量对const引用初始化后,将生成一个只读变量

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章