仅返回类型不同的函数,在C++中如何实现重载?
2024-10-21 15:47:01
C++支持函数重载,所谓重载就是在同一命名空间内,函数名相同,参数不同(参数个数或参数类型不同)的函数可以共存。但是若参数和函数名相同的话,编译器会报错不能重载。但是现实中,有时候仅仅需要返回类型不同的的函数,而这种情况C++又不支持重载,如:
- typedef struct TData {
- int a;
- int b;
- } TData;
- class CTest {
- public:
- TData &getData()
- {
- return data;
- }
- const TData &getData()
- {
- return data;
- }
- private:
- TData data;
- };
当仅需读data时,调用const TData &getData();当需要更改data时,调用TData &getData(),而现在由于C++不支持这种情况,那麽我们只能采取折衷的方案,第一种方法是,在读写的地方都使用TData &getData(),对于仅需要读的地方,这样做破坏了程序的本意;第二种做法是在仅读的地方,调用const TData &getData(),这样的话,在需要写的地方,就必须要强制类型转换,如:
- CTest test;
- TData *pData = (TData *)&test.getData();
如上,将其转换为指针的形式,从而可以对data进行修改,这种方式,相对第一种做法,确实要好一些。那么有没有一种方式,像是要函数重载一样使TData &getData()和const TData &getData() 同时共存呢?答案是肯定的,下面给出一种方法,绕开编译器的限制,如:
- #define GET_DATA() \
- public:\
- TData &getData() { return data; } \
- const TData &getData() const { return data; }
- typedef struct TData {
- int a;
- int b;
- } TData;
- class CTest {
- GET_DATA()
- private:
- TData data;
- };
如上通过宏定义的方式,这样就可以绕开编译器的检查,实现两种情况的并存,下面看看使用的例子,如下:
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- CTest test;
- /*写*/
- TData &data = test.getData();
- data.a = 1;
- data.b = 2;
- /*读*/
- const TData &data1 = test.getData();
- qDebug() << data1.a << data1.b;
- return app.exec();
- }
是不是很酷呢,接下来让我们看看写和读是不是真的是两个函数,还是一个函数,看看上面代码的反汇编,如下:
- CTest test;
- TData &data = test.getData();
- 0x004013e5 <+43>: lea -0x24(%ebp),%eax
- 0x004013e8 <+46>: mov %eax,(%esp)
- 0x004013eb <+49>: call 0x406440 <_ZN5CTest7getDataEv>
- 0x004013f0 <+54>: mov %eax,-0x10(%ebp)
- data.a = 1;
- 0x004013f3 <+57>: mov -0x10(%ebp),%eax
- 0x004013f6 <+60>: movl $0x1,(%eax)
- data.b = 2;
- 0x004013fc <+66>: mov -0x10(%ebp),%eax
- 0x004013ff <+69>: movl $0x2,0x4(%eax)
- const TData &data1 = test.getData();
- 0x00401406 <+76>: lea -0x24(%ebp),%eax
- 0x00401409 <+79>: mov %eax,(%esp)
- 0x0040140c <+82>: call 0x406440 <_ZN5CTest7getDataEv>
- 0x00401411 <+87>: mov %eax,-0xc(%ebp)
从上面的反汇编我们看到,两处调用的函数都是一样的,都是0x406440 <_ZN5CTest7getDataEv>,那麽这是为什么呢?这个留给读者去解决?欢迎大家积极解答?
http://blog.csdn.net/rabinsong/article/details/9708529
最新文章
- JSON总结(java篇)
- java入门笔记(1)
- DateUtil
- js 内存小记
- MongoDB的索引(三)
- PHP+七牛云存储上传图片代码片段
- Android 通过网页打开自己的APP(scheme)
- Object-C中的内存管理小记
- tomcat无法正常启动的一个原因
- HihoCoder
- jQuery解除超链接<;a>;的click事件
- 从入门到精通之Boyer-Moore字符串搜索算法详解
- 使用java类破解MyEclipse
- hdu_4463(最小生成树)
- CentOS7配置iptables防火墙
- django的视图函数
- python-django中间件session源码
- 阿里读写分离数据源SELECT LAST_INSERT_ID()获取不到id
- vue的手机端框架mint-ui头部header组件实现返回到上一个浏览页面
- [LintCode] Invert Binary Tree 翻转二叉树
热门文章
- 控制台下的计算器——C++实现
- [置顶] HDFS文件内容追加(Append)
- attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
- Javascript 匀速运动停止条件——逐行分析代码,让你轻松了解运动的原理
- Oracle EBS-SQL (SYS-24):职责列表
- 解密电子书之四:MCU(freescale)
- poj1547---结构数组
- MongoDB Error
- Python的迭代器(iterator)和生成器(constructor)
- 新浪微博布局学习——妙用TabHost