C++ 函数重载二义性
说起函数重载,我不由得想起了C++的“多态”特性。多态又分为静态(编译时)多态和动态(运行时)多态,静态多态即为函数重载,动态多态则是虚函数机制。虚函数水较深,先不讨论,今天我们来看一下函数重载、作用以及要避免的一些坑(尤其是二义性错误)。 一、先来review一下 函数重载的概念
二、如何匹配要使用那个函数呢? 在C++ primary 中文5版 P217我们可以发现端倪。
三、函数重载二义性 二义性是指在编译过程中无法找出最匹配的函数,或者说编译器在函数匹配过后还是有多个函数满足要求,无法确定该执行那一个引发的错误。 具体表现: 1. 参数数目引发的歧义 1 int get(){ 2 return 5; 3 } 4 int get(int a = 5){ 5 return a; 6 } 7 //调用get() 2. 参数隐式转换引发的歧义 1 int get(int m){ 2 return m; 3 } 4 5 long get(long m){ 6 return m; 7 } 1 int get(int a){ 2 return a; 3 } 4 int get(int &a){ 5 return a; 6 } 7 //int m = 10; 8 //调用get(m) 3. 类型型相关歧义(较深内容,不容易理解) P517-520,艰涩难懂,需要自己琢磨。 另外,我发现在P517的一个例子,是错误的,并未发生歧义,不会导致运行错误。 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 struct B; 6 struct A { 7 A() = default; 8 A(const B&){ 9 //转换B为A 10 cout << "A内部将B转换为A" << endl; 11 }; 12 //... 13 string name = "A"; 14 }; 15 16 struct B { 17 B() = default; 18 operator A() const{ 19 //类类型转换,B->A 20 cout << "B 类类型转换为 A" << endl; 21 }; 22 //... 23 string name = "B"; 24 }; 25 26 A f(const A&) { 27 //... 28 } 29 30 int main() 31 { 32 B b; 33 A a = f(b); 34 } (由g++运行) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |