存在数组的引用,而不存在引用类型的数组

存在数组的引用,而不存在引用类型的数组

#if 0

1.没有引用数组的原因:
(1).引用数组指的是引用类型的数组,也就是数组的各个成员是引用&类型,这是在c++中不能实现的

(2).c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的:指针类型也可以
指向某个变量,但指针类型本身也是一个变量,而引用实际上不是一个变量。更本质来说,可以
理解为引用没有自身的地址,不占用内存空间(这里为了简化问题可以这样考虑)。因此,
声明引用数组没有办法分配空间,因为根本就没有空间可以分配给引用。所以不能声明和定义引用数组

(3).C++不支持传统意义的复制:
传统的复制为:int a = b;
这里a和b在内存中分别占用不同的内存空间,但是内容一致。
如果int& a = b; 这个时候,内存中a并不被分配内存,所以没有复制可言。
所以对于数组元素是引用来说,没法完成元素的复制操作,没有给数组分配内存,所以数组中的元素不能是引用。

2.数组的引用的作用(存在) 如:int(&arr)[n]

(1).作为形参(防止数组退化为指针)
下面三种方法是等价的:
int func(int array[]);
int func(int array[10]);
int func(int* array);
在func中是无法知道数组的大小,如果开发者必须提前知道数组的大小,就需要用到数组的引用做参数
例如,int(&a)[2],可以有效的防止数组退化。也就是,数组作为函数参数传递过去后,仍然是一个数组。
优点:节省内存消耗,不用拷贝一份数组,直接使用原数组(甚至可以修改原数组)

#include <iostream>
using namespace std;

int func(int(&a)[6])
{
	int count = 0;
	for (int i = 0; i < 6; i++)
	{
		count += a[i];
	}
	return count;
}

int main()
{
	int a1[6] = { 1,2,3,4,5,6 };
	int count = func(a1);
	cout << "count:" << count << endl;
	return 0;
}

代码安全性提高:
如果将 int a1[6] = { 1,2,3,4,5,6 }; 改为 int a1[5] = { 1,2,3,4,5 };
编译会报错说明编译时将进行数组长度的检查


(2).作为返回类型
函数不能直接返回数组,但是可以返回数组的指针和数组的引用,还需要注意,返回的不能是栈对象,
因为栈对象很快会被销毁

有关定义:
题目:编写一个函数的声明,使其返回包含10个string对象的数组的引用

//不用类型别名
string(&func(形参))[10];

//类型别名
using arr = string[10];
arr& func(形参);

typedef string(&arr)[10];
arr func(形参);

//尾置返回类型
auto func(形参)->string(&)[10];

//decltype关键字
string ss[10];
decltype(ss) &func(形参);


例子:
#include "stdafx.h"
#include <iostream>
using namespace std;

int odd[] = { 1,3,5,7,9 };
int even[] = { 0,2,4,6,8 };

decltype(odd)& func(int i)
{
	return (i % 2) ? odd : even;
}

int main()
{
	cout << func(2)[1] << endl; //输出2
	return 0;
}

#endif

猜你喜欢

转载自blog.csdn.net/SwordArcher/article/details/81478912