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;
}
// 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;
}
}
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节将会介绍如恶化重新编写此函数,允许传递指向任意大小的数组的引用形参。
1438

被折叠的 条评论
为什么被折叠?



