难道这不是编译时错误吗?

时间:2014-05-22 13:36:33

标签: c++

class one
{
      public:
             int a;
             one& fun1()
             {
                    cout<<"  Fun1  \n";
             }
             one& fun2()
             {
                    cout<<"  Fun2  \n";
             }
};

在主要我执行“object.fun1()。fun2()” - 它工作正常。 虽然我的困惑是,在函数定义中我没有返回任何东西,看起来它正在返回这个指针,这不应该是一个错误吗?

1 个答案:

答案 0 :(得分:6)

不,不是。 Have a look at this answer解释了为什么编译器默认不发出错误。

无论如何,如果没有返回,函数的返回值将只是未定义(垃圾),当你尝试读取它时,你会得到未定义的行为。

  

看起来像是在返回这个指针

实际返回的内容取决于用于特定编译器和平台的调用约定。例如,如果在堆栈上推送返回值,则获得的值实际上可能是在执行cout语句期间在堆栈上推送的一些(现在无效)剩余数据。但它在很大程度上取决于非常具体的内部结构,大多数时候你不应该知道 - 只要记住返回值将是垃圾。

现在为什么你能做object.fun1().fun2()?正如@akappa在评论中解释的那样,您的成员函数是非虚拟的,并且不访问任何成员,因此编译器很可能将它们编译为不需要this指针的自由函数。

许多编译器都有开关来警告你缺少回报,例如gcc有-Wreturn-type,如果设置-Wall,它也会被激活。就个人而言,我总是通过设置-Werror=return-type将此警告定义为错误。这取决于你的编译器,但它也应该有一些功能来启用它。