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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

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);  // 采用具名迭代器对象

---------------------------------------------------

兄弟的公司:立即购--手机购物,诚信网购

兄弟的公司:立即团

欢迎转载,请注明作者和出处


本文转自 zhenjing 博客园博客,原文链接:http://www.cnblogs.com/zhenjing/archive/2011/01/28/function_declaration_STL.html   ,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
108 10
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
55 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
74 5
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
67 1
|
2月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
2月前
|
Kubernetes Linux 持续交付
docker容器学习
【10月更文挑战第1天】
39 1
|
2月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
55 5
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
24 1
|
2月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
59 2