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引用初始化後,將生成一個只讀變量

 

 

 

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