所以我用
调用了两个Word对象的重载Word w;
w+w;
声明和定义是:
Sentence operator+(const Word&) const;
Sentence Word::operator+(const Word& rightWord) const{
std::cout<<"Entering function Word::operator+(const Word&)."<<std::endl;
std::cout<<"Leaving function Word::operator+(const Word&).\n"<<std::endl;
}
执行w + w后,解构了Sentence对象(我重载析构函数以打印到stdout)我之前创建了一个句子对象,但我认为这不会影响它。我甚至不理解句子对象在构造时是如何被解构的(默认构造函数也被重载)。我也不明白为什么它会被创建,因为我甚至没有真正归还它。我通过gdb运行它,它肯定在退出添加函数时调用句子的析构函数。我可以提供更多代码,只是想到有人可能会在没有它的情况下知道问题。
答案 0 :(得分:0)
如果非void
函数没有返回任何内容,则未定义的行为。您观察到的所有效果都不是由C ++语言定义的,特定于您的编译器和/或只是随机的。
实际上,您的编译器应该为这段代码发出警告消息,甚至是错误。例如,以下使用Visual C ++ 2015生成error C4716: 'Word::operator+': must return a value
:
#include <iostream>
struct Sentence {};
struct Word {
Sentence operator+(const Word&) const;
};
Sentence Word::operator+(const Word& rightWord) const{
std::cout<<"Entering function Word::operator+(const Word&)."<<std::endl;
std::cout<<"Leaving function Word::operator+(const Word&).\n"<<std::endl;
} // error C4716
int main() {
}