C++中参数为引用构成的重载
今日看侯捷老师的C++课程,里面提到了void imag(const double& im) {}
和void imag(const double im) {}
具有同样的函数签名,所以不能进行重载,但在我实际测试中,发现编译器是允许通过传入参数是引用或值来构成重载的,遂进行了一些测试并记录一下。
以下测试环境均为VS2019编译器。
普通函数通过引用构成重载
本来从直觉上来说我也是赞同侯捷老师的看法,因为只通过引用区分函数在函数调用的时候会出现二义性,应该不允许该重载操作才对。因此写了下述两个函数:
1 | void func1(int&) |
编译发现编译器没有报错,编译器允许了这种重载方式。但是在尝试调用的过程中发现如果传入参数为变量的情况下,编译不通过。
1 | int main(){ |
如果想要调用引用版本的func1,有两种方式
1. 通过函数指针的方式明确调用的函数
1 | int main(){ |
2. 通过static_cast对函数类型进行转换
1 | int main(){ |
通过这种方式也可以指定调用非引用版本的func1。
类成员函数通过引用构成重载
对于类成员函数来说,同样的方法也可以实现调用,不过类成员函数的函数指针写法不一样而已。
1 | class A { |
上述代码编译器同样不会报错,但不能直接传入变量进行调用。
1 | int main(){ |
同样可以通过两种方式对引用版本进行调用
1. 通过函数指针的方式明确调用的类成员函数
不同点在于类成员函数(无static修饰符)的函数指针调用,需要指定具体的调用对象
1 | int main(){ |
2. 通过static_cast对类成员函数类型进行转换
同样需要指定调用的对象
1 | int main(){ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咸鱼成长小站!
评论