仅返回类型不同的函数,在C++中如何实现重载?
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
仅返回类型不同的函数,在C++中如何实现重载?的更多相关文章
- C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数
我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...
- 自定义的类型放入STL的set中,需要重载自定义类中的“<”符号(转)
在以前学习STL的时候,曾经学到过,如果要将自定义的类型放入到set中的话,就需要重载“<”符号,原因是set是一个有序的集合,集合会按照“<”比较的大小,默认按照从小到大的顺序排列.假设 ...
- IntelliSense 无法仅由函数的返回类型重装分辨
IntelliSense:无法仅由函数的返回类型重装分辨 d:\programfiles (x86)\microsoft sdks\windows\v7.0a\include\winbas ...
- VS2013 error C2556: “const int &Array<int>::operator [](int)”: 重载函数与“int &Array<int>::operator [](int)”只是在返回类型上不同
1,VS2013 错误 1 error C2556: “const int &Array<int>::operator [](int)”: 重载函数与“int &Array ...
- Kotlin函数使用综述与显式返回类型分析
位置参数与具名参数: 继续接着上一次https://www.cnblogs.com/webor2006/p/11498842.html的方法参数学习,再定义一个函数来说明具名参数的问题: 调用一下,先 ...
- [C#] async 的三大返回类型
async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
- async 的三大返回类型
序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task<TResult>. ...
- 在Java中为什么不同的返回类型不算方法重载?
本文已收录<Java常见面试题>:https://gitee.com/mydb/interview 方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是 ...
随机推荐
- JAVA 年轻代收集器 第九节
JAVA 年轻代收集器 第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低. 因此我 ...
- 在VS工程中,添加c/c++工程中外部头文件及库
在VS工程中,添加c/c++工程中外部头文件及库的基本步骤: 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录. 2.添加文件引用 ...
- Web 前端知识点
- SharedPreferences最佳实践
转:http://blog.csdn.net/xushuaic/article/details/24513599 笔记摘要:该文章是我在Android Weekly中看到的,以前也一直用SharedP ...
- 浏览器间bug
转自:http://www.cnblogs.com/yexiaochai/archive/2013/06/10/3130632.html 1.IE7的bug 就是z-index需要依赖其父元素的z-i ...
- codeforces 665D Simple Subset
题目链接 给一个数列, 让你选出其中的m个数, 使得选出的数中任意两个数之和都为质数, m尽可能的大. 首先, 除了1以外的任意两个相同的数相加结果都不是质数. 然后, 不考虑1的话, 选出的数的个数 ...
- 数字证书管理工具keytool常用命令介绍
需要给一个apk加签名,用到了keytool这个工具,下面转载一篇介绍keytool的文章 http://blog.chinaunix.net/uid-17102734-id-2830223.html ...
- SQL Server 输出受影响的行
前期准备: create table Nums(X int); create table T(X int); go 目的:把对表Nums的insert | delete | update 反映到T表中 ...
- CSV 客座文章系列:KGroup 通过 Windows Azure 将 Qoob 内容管理发布到云中
编辑人员注释: 今天这篇文章由 KGroup 首席软件架构师兼研发部主管 Jody Donetti 与 KGroup 技术总监 Simone Procopio 共同撰写,介绍了 KGroup 如何使用 ...
- NOI2015 Day1
NOI2015 Day1 程序自动分析 题目描述:给出等式或不等式\(n\)条,问\(n\)条式子是否成立. solution: 用并查集处理等式,在判断不等式是否成立. 时间复杂度:\(O(n)\) ...