C++-有关C++中实现重载函数的一些问题
其实重载函数大家都知道,一般来说,如果函数名相同,但是函数的参数类型,参数个数不同,就会构成重载函数。这个是可以理解的。因为C++编译器在编译这些重载函数的时候,都会修改函数名,附带上参数的类型。但是我最近看的一本书上说“普通函数成员参数表后的const修饰隐含参数,当出现和该函数成员同名同参数表的函数成员时,由于这两个函数成员的隐含参数的修饰符不同,故这两个函数成员均被视为重载函数。如果普通函数成员参数表出现volatile,则可以仿照const得出类似的结论。”
如下面这段代码所示:
#include <iostream.h>
class A
{
int a;
public:
A(int x) {a = x;}
int f() { a++; return a;}
int f() volatile { a++; return a;}
int f() const volatile { return a;}
}
A x(3);
const A y(6);
const volatile A z(8);
void main()
{
x.f();
y.f();
z.f();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于这个问题的解释,关键是你是否知道this指针的存在——如果不清楚,可以参考C++书籍。我这里只是简单说明一下:每个成员函数都有一个隐含参数,名为this,指定调用函数的对象。
比如你的例子中,A类的int f()函数实际上会被编译器解释为int f(A*this)。当你在f函数内引用成员变量a,实际上是this->a。“普通函数成员参数表后的const修饰隐含参数”这句话中的“隐含参数”,就是指这个由编译器暗中添加的this指针。当然你在代码里也可以显式地使用this,它同时是一个C++关键字,在任何成员函数里都可使用。
明白了这点,这段文字的意义也就清楚了:f(A *this)、f(const A *this)和f(volatile A *this),当然是三种不同的重载函数。也正因为this所指对象被赋予了不同的修饰,在相应的函数体内部,隐含了this->的那些数值成员,也就都被传递了这样的修饰符。比如,在int f() const内部,成员变量a就被视为常量。
针对楼主的问题,我觉得不直接回答,举个例子回答你。
比如两个这两个函数
int f(int c) { a++; return a;}
int f(int c) const { a++;return a + c;}
这个也只是“修饰符不同”,但是你想,C++内部实现常函数的时候是怎么实现的呢?传入的参数是不能改的,所以第二个函数传入的int c,在编译的时候是肯定会编程const int c的。所以这个参数是不同的,所以说“参数类型不同可以实现函数重载”是可以证明对于修饰符不同的函数,重载也是没问题的。由于C++语法特性太多,所以说有些问题从根本上看的话才会更清晰