数组、模板、引用(C++ primer)



C++ primer的模板一章由于水平有限,之前看了两遍C++ primer都是到这里中断。

最近学习Effective C++,从Item 43开始讲解模板的一些技巧,因为之前都是从网上查找的一丁半点的关于模板的介绍,都没从书里正儿八经的去看,不意外的,卡住了。

看来先要打牢下基础,继续翻看C++ primer, 看到16.15的非类型模板形参的时候,发现模板竟然可以这么用,太神奇了(⊙﹏⊙b汗,白当了一年的码农)。

模板里面的“size_t N”和“&”,需要注意,这里的&是指引用,刚开始把他&想成取地址了,脑残了,哈哈

template<class Type, size_t N>
void PrintArr(Type (&arr)[N])
{
	for(size_t i = 0; i != N ; i++)
	{
		cout << arr[i] << "\t";
		flush(cout);
	}
	cout << endl;
}

继续往下看,16.21介绍说,当形参为引用时,数组不能转换为指针,这竟是7.24的内容,可怜我竟然不知道,看来光看书还是,不行的, 要实战加复习。

7.24内容码字码一遍。


4.通过引用传递数组

和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的应用,编译器不会将数组实参转换为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配:

// ok : parameter is a reference to an array:size of array is fixed
void printValues(int (&arr)[10]);
int main()
{
	int i = 0, j[2] = { 0, 1};
	int k[10] = { 0, 1, 2, 3, 4. 5, 6, 7, 8, 9 };
	printValues(&i);	// error:argument is not an array of 10 ints
	printValues(j);		// error:argument is not an array of 10 ints
	printValues(k);		// ok:argument is an array of ints
	return 0;
}


这个版本的printValues函数只严格地接受含有10个int型数值的数组,这限制了哪些数组可以传递。然而,由于形参是引用,在函数中依赖数组的大小是安全的:


// ok:parameteris a reference to an array: size of array is fixed
void printValues(int (&arr)[10])
{
	for(size_t i = 0; i != 10; ++i)
	{
		cout << arr[i] << endl;
	}
}


&arr两边的圆括号是必须的,因为下标操作符具有更高的优先级:
f(int &arr[10]) // error: arr is an array of references
f(int (&arr)[10]) // ok: arr is a reference to an array of 10 ints



在16.15节将会介绍如恶化重新编写此函数,允许传递指向任意大小的数组的引用形参。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值