有人能告诉我这段代码中的析构函数是做什么的吗?一个电话示例: “
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();
}
}
};
答案 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&)
。但是如果没有返回值优化(或者一个好的移动构造函数),它就会抛出。Format
的插入运算符Format& Format::operator<<(const T&)
,string
类型。Format
的插入运算符Format& Format::operator<<(const T&)
,int
类型。由于Format
对象是临时对象,因此在operator<<
被调用两次之后,它会在行尾被销毁。因为它只包含两个'%',所以它的析构函数不会抛出。