[C++再学习系列] 函数声明与STL容器构造
2011-01-28 10:56
453 查看
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);
//
采用具名迭代器对象
---------------------------------------------------
兄弟的公司:立即购--手机购物,诚信网购
兄弟的公司:立即团
欢迎转载,请注明作者和出处
有一条通用规则
——
几乎任何东西都可能被分析成函数声明。而且函数声明存在多种形式。示例:
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);
//
采用具名迭代器对象
---------------------------------------------------
兄弟的公司:立即购--手机购物,诚信网购
兄弟的公司:立即团
欢迎转载,请注明作者和出处
相关文章推荐
- [C++再学习系列] 函数声明与STL容器构造
- [C++再学习系列] STL容器删除操作总结
- [C++再学习系列] STL容器删除操作总结
- [C++再学习系列] STL容器删除操作总结
- C/C++语言函数学习(3)STL中map容器
- [C++再学习系列] STL容器的存储结构
- [C++再学习系列] STL容器删除操作总结
- [C++再学习系列] Using声明和指令的工作原理
- [C++再学习系列] 虚函数的4条规则
- [C++]STL中vector容器 begin()与end()函数、front()与back()的用法
- C/C++函数学习(6)容器分类
- STL学习系列之二——序列容器(vector)
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
- c++学习之容器——erase()函数
- 【C++ STL学习之一】容器的共通能力和共通操作总结
- C++ STL学习笔记四 list双向链表容器
- 【C++】vector容器和list容器中使用单个迭代器的erase函数学习笔记
- STL学习系列三:Deque容器
- C++学习笔记——STL(二)vector容器
- STL学习系列之五——关联容器