int main(){
printf("1:");
int i = CRO();
printf("2:");
float f = CRO();
printf("3:");
void p = CRO();
printf("4:");
CRO();
}
程序输出为:
1:int
2:float
3: void
4:void
请设计一个CRO()满足以上输出。
呵呵,这样行不行!
#include "stdafx.h"
#include <iostream>
using namespace std;
struct CRO
{
#define void void *
CRO() { type_ = "void"; }
~CRO() { cout << type_.c_str() << endl; }
operator int() { type_ = "int"; return 0; }
operator float() { type_ = "float"; return 0.0; }
operator void () { type_ = "void"; return 0; }
private:
string type_;
};
int main()
{
printf("1:");
int i = CRO();
printf("2:");
float f = CRO();
printf("3:");
void p = CRO();
printf("4:");
CRO();
system("PAUSE");
return 0;
}
可以使用强制转换运算符的重载来实现前面3个。
最后一个void,本来是想在关闭RVO的情况下用拷贝构造函数实现 ,但是会影响到前三个的输出,所以还是没想到啥好方法。
#include <stdio.h>
class CRetType
{
public:
operator int()
{
printf("int\n");
return 0;
}
operator float()
{
printf("float\n");
return 0.f;
}
operator void*()
{
printf("void*\n");
return nullptr;
}
};
CRetType CRO()
{
return CRetType();
}
int main() {
printf("1:");
int i = CRO();
printf("2:");
float f = CRO();
printf("3:");
void* p = CRO();
printf("4:");
CRO();
return 0;
}
你的代码首先都不对,printf("1:)";,这里括号在引号里面,根本不能编译。
哎呀我输入错误,你应该知道什么意思吧引号就在里面的。
#include "stdafx.h"
#include <iostream>
using namespace std;
char *pa[] = { "int", "float", "void *", "void" };
int pa1 = 0;
#define CRO() (printf("%s\n", pa[pa1++]), NULL)
int _tmain(int argc, _TCHAR* argv[])
{
printf("1:");
int i = CRO();
printf("2:");
float f = CRO();
printf("3:");
void * p = CRO();
printf("4:");
CRO();
}
1:int
2:float
3:void *
4:void
Press any key to continue . . .
如果用void CRO(),可能在一些编译器上可以,但是在我的VC++2010上不行。
看你写了 rtti,但是我觉得C++编译器不可能在运行的时候得到返回值接收者的类型,除非有debug版的hacking
你可以看下,函数的调用,是先对函数求值,再传给返回值的。换言之,在函数内根本不可能得知“未来”发生了什么,也就是它的结果送到哪里去。
如是面试题,考官可能想考如下两点:
1、考核C++函数中“多态”的定义。
要求面试者解释什么时函数的多态,并且明确告知返回值不能做为多态的定义。
如再深入一点,则解释多态是如何实现的,为何编译实现时不能使用返回值做为多态的要素之一。
2、考核硬是不能实现时,程序员如何办。
要求面试者碰到这种问题时怎么办。从需求、限制等多方面解释。
这不是一个函数,这是四个同名函数。
你说:int f(void); 和 float f(void)是一个函数是吗?
或者这么说这个是重载,虽然名字相同,但是对应不同的函数。比如:calss A {int f(); float f() .....}
难道你想预知返回值类型?那void p是什么鬼?
其实没必要想得那么复杂。题目并非要求了你的CRO();返回的必须是前方定义的类型,这里可以用最笨的方式解决就是我们初学时做题的思路,一个个输出,比如CRO();这个函数的用处就是第一次执行时输出int,第二次输出float,第三次输出void,第四次输出void。
或许有人说这种方式有点弱智,但是只是要满足题目的话无论什么方法都是可以接受的。