在调用析构函数时,本例中使用了什么?

时间:2014-01-03 21:38:33

标签: c++ destructor

有人能告诉我这段代码中的析构函数是做什么的吗?一个电话示例: “

int year = 2012; 
string hello = "Hello"; 
cout << format("% world! The year is %\n") << hello << year;

” 我不知道带有“while”的析构函数。 。 。为什么我们需要它?这应该打印:“Hello world!The year is 2012”。 。 。如果我理解得很好,那么当调用“throw”意味着在str的结尾时调用析构函数?

TempFormat format(const char*) { 
  return TempFormat(const char*); 
} 

class TempFormat { 
  const char* str; 
public: 
  TempFormat(const char* str) : str(str) {} 

  friend Format& operator<<(ostream& os, TempFormat& f) { 
    return Format(f.str, os); 
  } 
};

class Format {
  const char* str; 
  ostream& os; 
public: 
  Format(const char* str, ostream& os) : str(str), os(os) {} 

  template<class T> 
  Format& operator<<(const T& t) { 
    while(*str && *str != '%'){ 
      os << *str; 
      str++; 
    } 
    if (*str != '%') { 
      throw std::exception(); 
    } 
    os << t; 
    while(*str && *str != '%'){ 
      os << *str; 
      str++; 
    } 
    return *this; 
  } 

  ~Format() { 
    while(*str && *str != '%'){ 
      os << *str; 
      str++; 
    } 
    if (*str == '%') { 
      throw std::exception(); 
    } 
  } 
}; 

1 个答案:

答案 0 :(得分:2)

析构函数只检查格式字符串中的所有'%'是否已被处理。如果字符串包含的对象接收参数多于'%',则析构函数将抛出异常。

修改cout << format("% world! The year is %\n") << hello << year;行非常狡猾,因为此处的<<运算符都不是经典的ostream& operator<<(ostream&, type)重载。

  • 第一个<<实际上是Format& operator<<(ostream&, TempFormat&),它返回一个Format对象。它也是一种憎恶,它通过引用返回一个局部变量,并通过非常量引用获取一个无名的临时变量。它甚至编译?它的原型可能应该是Format operator<<(ostream&, TempFormat const&)。但是如果没有返回值优化(或者一个好的移动构造函数),它就会抛出。
  • 第二个'&lt;&lt;&lt;实际上是Format的插入运算符Format& Format::operator<<(const T&)string类型。
  • 第三个'&lt;&lt;&lt;实际上是Format的插入运算符Format& Format::operator<<(const T&)int类型。

由于Format对象是临时对象,因此在operator<<被调用两次之后,它会在行尾被销毁。因为它只包含两个'%',所以它的析构函数不会抛出。