MyMSDN

MyMSDN记录开发新知道

将数组作为实参传递

在C++中我们应该少用指针,多用引用,原因请大家自行搜索。在传递数组的时候我们需要格外注意,先让我们看一个简单的范例。

// PassArray.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

template <typename T>
void Func1(T, T);
template <typename T>
void Func2(T&, T&);
void Func3(int (&)[10], int (&)[12]);

int _tmain(int argc, _TCHAR* argv[])
{
    int a[10], b[12];

    Func1(a, b);
    Func2(a, b);
    Func3(a, b);

    return 0;
}

template <typename T>
void Func1(T, T)
{
    cout<<"Func1.invoked!"<<endl;
}
template <typename T>
void Func2(T&, T&)
{
    cout<<"Func2.invoked!"<<endl;
}
void Func3(int (&m)[10], int (&n)[12])
{
    cout<<"Func3.invoked!"<<endl;
}

首先这个范例无法编译通过:

error C2782

原因就出在类型推断上。根据定义,Func2的类型必须是T&,也就是说传递实参的时候,两个形参必须是相同的,而这一点在模板编程中就会由编译器来负责推断。

Func1:

调用Func1(a, b)则推断的类型分别是Func1(int*, int*),调用函数将会自动将数组的首地址指针作为实参进行传递,因此类型推断两形参相同,编译通过!

Func2:

调用Func2(a, b)因为我们希望按引用的方式进行实参传递,因此需要遵循这样的规律:

(P208)如果形参是数组的引用,编译器将不会将数组实参转化为指针,而是传递数组引用的本身。在这种情况下,数组大小成为形参和实参类型的一部分。

所以推断类型分别是Func2(int (&)[10], int (&)[12]),因为int (&)[10] != int (&)[12],所以与T == T相悖!自然也就编译不过了!

Func3:

该函数是Func2的一个静态表示,通过上面的解释应该很容易理解这个代码了。

posted on 2009-02-19 21:35 volnet 阅读(1666) 评论(0)  编辑 收藏 引用 所属分类: C++ Primer 学习笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


特殊功能