函数重载 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】:由于int
、int&
和int*
都是不同的类型,所以在这些上重载是合法的。
您还可以在 const
上重载,这在设计表现出真正 const 正确性的类时非常有用。
int hello(int);
int hello(int) const;
您不能重载返回类型,因为编译器一般不知道要使用哪个函数,尤其是在函数返回类型被调用者丢弃的情况下。
【讨论】:
以上是关于函数重载 C++ 指针的主要内容,如果未能解决你的问题,请参考以下文章
C++基础2 引用 函数扩展: 默认值 占位符 指针 重载 类:引用类指针 声明实现分开写