仅返回类型不同的函数,在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 方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是 ...
随机推荐
- std::string 字符替换函数
// 替换路径中所有“\”为“/” #include <algorithm> static std::string ConvertSlash(std::string& strUrl ...
- Android 通过HTTP POST请求互联网数据
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ...
- hdu 5727 Necklace 二分图匹配
题目链接 给2*n个珠子, n<=9, n个阴n个阳. 然后将它们弄成一个环, 阴阳交替.现在给你m个关系, 每个关系给出a, b. 如果阳a和阴b挨着, 那么a就会变暗. 问你最小变暗几个阳. ...
- (15)Visual Studio中使用PCL项目加入WCF WebService参考
原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2 ...
- Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题
这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐 ...
- Android采用HttpClient下载图片
在上一章中谈到Android采用HttpURLConnection下载图片,本章使用HttpClient下载图片 HttpURLConnection与HttpClient的差别: HttpClient ...
- UVA 12075 - Counting Triangles(容斥原理计数)
题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...
- xcode UIImageView创建、图片加载、 音频文件播放、 延迟调用
代码创建 /** 创建UIImageView */ UIImageView * imageView=[[UIImageView alloc]init]; /** 设置尺寸位置 */ imageView ...
- Nutch
nutch 插件开发[资料整理]:http://my.oschina.net/cloudcoder/blog/472915 Nutch2.3+Mongodb+ElasticSearch:http:// ...
- android入门——UI(3)
Spinner控件 ListView控件 一.Spinner控件 点击Spinner会弹出一个包含所有可选值的dropdown菜单,从该菜单中可以为Spinner选择一个新值. 有两种指定数据源的 ...