zoukankan      html  css  js  c++  java
  • [C++再学习系列] 函数声明与STL容器构造

    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 的函数,而非叫做 wWidget 对象

    解决方案:去掉 ()

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

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

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

    兄弟的公司:立即团

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

  • 相关阅读:
    BZOJ1050: [HAOI2006]旅行comf(并查集 最小生成树)
    洛谷P1762 偶数(找规律)
    抽象类的基本概念------abstract
    百度地图小图标没有显示的解决方案
    nfs:server 172.168.1.22 not responding,still trying问题解决方法 平台为RealARM 210平台
    大话分页(二)
    In App Purchases(IAP 应用程序內购买): 完全攻略
    快速修改数组的问题
    64位linux中使用inet_ntoa报错处理
    CDN和双线机房相比有何优势
  • 原文地址:https://www.cnblogs.com/zhenjing/p/function_declaration_STL.html
Copyright © 2011-2022 走看看