C++的引用&

1.引用的实质是对一个内存空间起别名

注意:引用必须初始化,引用有自己的内存空间!!!!

#include
using namesapce std;


int main()
{
    int a = 10;
    int &b = a;//此时改变b的值就是改变a的值

    cout << a << endl;
    cout << b << endl;
    
    b = 20;

    cout << a << endl;
    cout << b << endl;

    return 0;
}

所以如果把引用作为函数的参数,起到的作用就是形参为实参的别名,所改变的就是实参,相当于取地址的操作。例:

#include
using namespace std;

void swap(int a, int b)//a,b不改变,因为a,b的生命周期只在swap函数内,结束swap后a,b就消失,不改变实参
{
	int c = 0;
	c = a;
	a = b;
	b = c;
}

void swap1(int *a, int *b)//使用指针,交换地址实现数字变换
{
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}

void swap2(int& a, int& b)//使用引用,a,b是实参的别名,相当于对实参的调用
{
	int c = 0;
	c = a;
	a = b;
	b = c;
}

int main()
{
	int x = 1;
	int y = 2;
	swap(x, y);
	cout << x << "," << y << endl;

	swap1(&x, &y);
	cout << x << "," << y << endl;

	swap2(x, y);
	cout << x << "," << y << endl;

	return 0;
 }

C++引用使用时的难点:

当函数返回值为引用时

若返回栈变量,不能成为其它引用的初始值,不能作为左值使用

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

可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用

int geta()
{
	int a = 10;
	return a;
}

int& geta1()
{
	int a = 10;
	return a;
}

int* geta2()
{
	int a = 10;
	return &a;
}

void main()
{
	int a1 = 0;
	int a2 = 0;
	a1 = geta();
	cout <<"a1:"<< a1 << endl;
	
	a2 = geta1();
	cout <<"a2:"<< a2 << endl;

	int &a3 = geta1();
	cout <<"a3:"<< a3 << endl;
}

 函数引用作左值

int g()
{
	static int a = 0;
	a++;
	return a;
}

int& g1()
{
	static int a = 0;
	a++;
	return a;
}

void main()
{
	//g() = 100;//错误
	g1() = 100;
}

 引用作左值时相当于变量。

常引用

 

                                                                                                                                                                                                               NoN小旻

                                                                                                                                                                                                               2018.9.17

你可能感兴趣的:(自学)