函数重载 C++ 指针

Posted

技术标签:

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

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

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

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

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

还有

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

【问题讨论】:

【参考方案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;

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

【讨论】:

以上是关于函数重载 C++ 指针的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“没有重载函数需要 2 个参数”错误 C++

C++基础2 引用 函数扩展: 默认值 占位符 指针 重载 类:引用类指针 声明实现分开写

C++函数调用运算符 函数对象 函数指针

C++类和对象(this指针6个默认成员函数const成员)

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载