【问题标题】:Function Overloading C++ Pointers函数重载 C++ 指针
【发布时间】:2014-05-30 21:48:25
【问题描述】:

我知道如果参数的数量不同,或者参数类型不同,重载一个函数是合法的。

为什么只有返回类型的区别是不合法的?

另外,这样重载是否合法:

int hello(int x);
int hello(int &z);

还有

int hi(int x);
int hi(int *z);

【问题讨论】:

    标签: c++ overloading


    【解决方案1】:

    编译器无法仅通过返回值来判断您尝试调用哪个函数。由于不需要捕获返回值,您可以这样写:

    hello( 1 ); // return int
    hello( 2 ); // return float
    

    从可见的情况来看,它们是完全相同的调用。

    是的,这是合法的,因为第一个 hi 需要一个引用,第二个 hi 需要一个内存地址。你可以这样称呼它:

    hi( myNumber );
    hi( &myNumber );
    

    完美区分。

    【讨论】:

      【解决方案2】:

      编译器很难根据返回类型选择重载。在许多情况下,编译器没有明确的声明来推断程序员的预期返回类型。即使有可能,程序员也会感到困惑。

      假设 C++ 具有基于返回值的重载:

      float func() {...};
      int func() {...};
      
      int x = func(); // OK, compiler may choose `int` version!
      

      但是,怎么样...

      cout << func() + func();
      

      你期待什么?也许我们可以定义一些规则,但它会使代码变得复杂、混乱和不可读。

       

      其他重载是合法的。由于不同的入口参数类型。

      【讨论】:

        【解决方案3】:

        你不能超载:

        int hello(int x)   // 1
        {
           return x;
        }
        
        int hello(int& x)  // 2
        {
           return x;
        }
        
        int hello(int const& x) // 3
        {
           return x;
        }
        
        void foo()
        {
           int i = 10;
           hello(i);    // Can't disambiguate between 1 and 2
           hello(10);   // Can't disambiguate between 1 and 3
        }
        

        但是,您可以重载:

        int hello(int& x)  // 4
        {
           return x;
        }
        
        int hello(int const& x) // 5
        {
           return x;
        }
        
        void foo()
        {
           int i = 10;
           hello(i);    // Picks 4
           hello(10);   // Picks 5
        }
        

        【讨论】:

        • 我认为你的前导句具有误导性。你可以重载这些,但在某些情况下你会遇到模棱两可的分辨率错误。
        【解决方案4】:

        想一想编译器如何能够找出您想要调用的函数。在第一个例子中,如果我写

        int z = 5; 
        int y = hello (z);
        

        编译器将如何确定您要调用哪个函数?但在第二个例子中,

        int z = 5; 
        int y = hi (z);
        int u = hi (&z);
        

        很清楚要调用哪个函数。您不能仅在返回类型上重载,因为编译器需要参数来选择要调用的函数。

        【讨论】:

          【解决方案5】:

          对我来说很好,这不是同一类型;例如 int x 是整数,而 int *z 是整数的非指针。

          【讨论】:

            【解决方案6】:

            在许多情况下,允许在返回类型上重载确实没有技术问题,编译器知道函数调用所在的表达式需要什么类型,因此知道要调用哪个函数。但是也有一些问题,比如如果返回的值没有被使用,那么你就会有歧义。

            至于函数,所有这些都是有效的重载。 hello 的情况可能会有些歧义,具体取决于您如何调用它,例如,如果您使用变量调用它,那么编译器无法真正判断您想要哪个版本的 hello

            【讨论】:

              【解决方案7】:

              由于intint&amp;int* 都是不同的类型,所以在这些上重载是合法的

              您还可以在 const 上重载,这在设计表现出真正 const 正确性的类时非常有用。

              int hello(int);
              int hello(int) const;
              

              您不能重载返回类型,因为编译器一般不知道要使用哪个函数,尤其是在函数返回类型被调用者丢弃的情况下。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-12-24
                • 2017-03-06
                • 1970-01-01
                • 2015-05-22
                相关资源
                最近更新 更多