【问题标题】:How the point manipulator function is working? [closed]点操纵器功能如何工作? [关闭]
【发布时间】:2018-12-01 20:13:57
【问题描述】:
#include <iostream>

using namespace std;

ostream& point(ostream& s)  //Point a manipulator func
{       
    s << "-->";
    return s;

}

int main()    
{    
    cout << point << 10;
    return 0;
}

//--------------------------------------------- ----------------------------------------//

【问题讨论】:

  • 将其正文替换为s &lt;&lt; "--&gt;"; return s;
  • 使用完整的解释性句子。你有什么不明白的?并在您使用时打开编译器警告。
  • 现在代码不同了。我们应该看什么代码?和我们谈谈。用你的话。

标签: c++ iostream ostream


【解决方案1】:

很糟糕。

该函数有几个错误。

  1. 无论s 是什么,它都直接流向cout。因此,如果您将 point 流式传输到另一个流,而不是 cout,则结果会转到错误的位置。

  2. 缺少return 语句,因此您的程序具有未定义的行为。你的编译器应该已经警告你了。您应该再次返回流以允许链接。这是 IOStream 所期望的约定。

可以这样写:

ostream& point(ostream& s)
{
   s << "-->";
   return s;
}

此版本“有效”,因为 IOStreams 专门设计为接受这种形式的“指向函数”并以流的引用作为其第一个参数来执行它。这是一个特点。这就是 IO 操纵者(包括 endl!)的工作方式。

【讨论】:

    【解决方案2】:

    输出流类有一些将某些函数指针作为参数的重载。特别是有一个输出运算符声明为(忽略实际涉及模板):

    std::ostream& std::ostream::operator<< (
         std::ostream& (*manip)(std::ostream&));
    

    当这个操作符被调用时,它会自己调用传递的函数,例如:

    manip(*this);
    

    也就是说,“插入”这样一个操纵器函数会导致函数以流作为参数被调用..

    【讨论】:

    • 我不明白这是什么意思 "(*manip)(std::ostream&)" ?
    • @Udesh:这是指向函数的指针类型的一部分(它缺少返回类型):通常它看起来像R(*name)(A...)R 是返回类型(在本例中为std::ostream&amp;),name 只是名称,它前面的* 表示它是一个指针。 A... 是参数类型列表,在本例中为 std::ostream&amp;。您可以通过使用&amp;f 获取函数地址或在预期函数指针的上下文中命名函数时衰减到指针来获得函数指针(这通常用于操纵器)。
    猜你喜欢
    • 2011-06-05
    • 2011-12-17
    • 1970-01-01
    • 2021-01-13
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多