仅返回类型不同的函数,在C++中如何实现重载?
来源:互联网 发布:python pdb模块 编辑:程序博客网 时间:2024/05/21 08:43
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),%eax0x004013e8 <+46>: mov %eax,(%esp)0x004013eb <+49>: call 0x406440 <_ZN5CTest7getDataEv>0x004013f0 <+54>: mov %eax,-0x10(%ebp) data.a = 1;0x004013f3 <+57>: mov -0x10(%ebp),%eax0x004013f6 <+60>: movl $0x1,(%eax) data.b = 2;0x004013fc <+66>: mov -0x10(%ebp),%eax0x004013ff <+69>: movl $0x2,0x4(%eax) const TData &data1 = test.getData();0x00401406 <+76>: lea -0x24(%ebp),%eax0x00401409 <+79>: mov %eax,(%esp)0x0040140c <+82>: call 0x406440 <_ZN5CTest7getDataEv>0x00401411 <+87>: mov %eax,-0xc(%ebp)
从上面的反汇编我们看到,两处调用的函数都是一样的,都是0x406440 <_ZN5CTest7getDataEv>,那麽这是为什么呢?这个留给读者去解决?欢迎大家积极解答?
- 仅返回类型不同的函数,在C++中如何实现重载?
- IntelliSense 无法重载仅按返回类型区分的函数
- 函数重载:仅根据函数返回值类型不能实现重载
- C++中函数定义返回类型和内部实现返回类型不同的原因
- C++中函数定义返回类型和内部实现返回类型不同的原因
- C++中函数返回值得问题--返回类型的引用和仅返回类型的区别
- Java里如何实现一个方法在不同情况下“返回”不同的类型变量?
- 参数类型不同的函数重载(C++)
- C#实现函数根据返回类型重载
- 如何实现 C 的函数重载
- 只能靠参数而不能靠返回值类型的不同来区分重载函数
- 一个类如何实现两个接口中同名同参数不同返回值的函数
- C++--String类型各种重载函数的实现
- C++--String类型各种重载函数的实现
- error C2556: “void main(void)”: 重载函数与“int main(void)”只是在返回类型上不同
- Java重载可以有不同的返回类型
- 在js中如何实现方法重载?以及函数的参数问题
- 在C中如何使函数返回数组
- 今天 pcDuino 到了,上手还算顺利
- IP 和 InetAddress
- android 手机管理软件 发布开源代码
- 基础数据结构总结
- HDU 4638 多校四-1007
- 仅返回类型不同的函数,在C++中如何实现重载?
- 关于DNS。
- 在csdn开博客的第一天
- 长短连接使用
- 倾诉
- Android的menu的使用实例
- 浅谈Java SE、Java EE、Java ME三者的区别
- 奇偶排序
- HDUOJ 4642 2013多校第四场第11题 Fliping game