C++-有关C++中实现重载函数的一些问题

发布于 2016-11-09 08:48:15 字数 683 浏览 1161 评论 2

其实重载函数大家都知道,一般来说,如果函数名相同,但是函数的参数类型,参数个数不同,就会构成重载函数。这个是可以理解的。因为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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜柠檬 2017-01-13 17:26:33

对于这个问题的解释,关键是你是否知道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就被视为常量。

夜无邪 2017-01-04 05:36:04

针对楼主的问题,我觉得不直接回答,举个例子回答你。
比如两个这两个函数

int f(int c) { a++; return a;}
int f(int c) const { a++;return a + c;}

这个也只是“修饰符不同”,但是你想,C++内部实现常函数的时候是怎么实现的呢?传入的参数是不能改的,所以第二个函数传入的int c,在编译的时候是肯定会编程const int c的。所以这个参数是不同的,所以说“参数类型不同可以实现函数重载”是可以证明对于修饰符不同的函数,重载也是没问题的。由于C++语法特性太多,所以说有些问题从根本上看的话才会更清晰

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文