您的位置:首页 > 编程语言 > C语言/C++

[C++再学习系列] 函数声明与STL容器构造

2009-08-23 11:55 381 查看
C++

有一条通用规则

——

几乎任何东西都可能被分析成函数声明。而且函数声明存在多种形式。示例:

1

.声明一个函数

f

带有一个

double

参数而且返回

int

。下面三种形式是相同的:

int f(double d);

int f(double (d));

//

同上;名为

d

的参数左右的括号是多余的,被忽略

int f(double);

//

同上;参数名被省略

2

.声明一个函数

g

,参数是指向一个没有参数、返回

double

的函数的指针



int g(double (*pf)());

// g

带有一个指向函数的指针作为参数

pf

使用非指针语法来声明(一个在

C



C++

中都有效的语法):

int g(double pf());

//

同上;

pf

其实是一个指针

int g(double ());

//

同上;参数名省略

注意参数名左右的括号(

就像

f

的第二种声明中的

d

)和单独的括号

之间的区别。参数名左右的括号被忽略,但单独的括号指出存在一个参数列表:它们声明了存在指向函数的指针的参数



常见错误:

1.

Widget w();

//

声明了一个叫作

w

的没有参数且返回

Widget

的函数,而非叫做

w



Widget

对象

解决方案:去掉

()



2.

list<int>
data(istream_iterator<int>(dataFile), istream_iterator<int>());

说明:声明了一个函数

data

,它的返回类型是

list<int>

。这个函数

data

带有两个参数:

*

第一个参数叫做

dataFile

。它的类型是

istream_iterator<int>



dataFile

左右的括号是多余的而且被忽略。

*

第二个参数没有名字。它的类型是指向一个没有参数而且返回

istream_iterator<int>

的函数的指针。

解决方案:用括号包围一个实参的声明是不合法的

,但用括号包围一个函数调用是合法的,所以通过增加一对括号,强迫编译器以特定方式解析

(

函数调用方式

)



list<int>
data( (istream_iterator<int>(dataFile)), istream_iterator<int>());

//

注意在

list

构造函数的第一个实参左右的新括号

可惜,并非所有的编译器都接受上述符合

C++

标准的代码。更好的方式:采用具名对象代替默认构造的临时对象

(

同时也使代码更可读

)

。示例:

ifstream
dataFile("ints.dat");

istream_iterator<int>
dataBegin(dataFile);

istream_iterator<int>
dataEnd;

list<int>
data(dataBegin, dataEnd);

//

采用具名迭代器对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: