下面是一公司的笔试题

mygoodday 2006-06-20 01:51:21
这是一家笔试题目,感觉有点乱,谁能知道最终的输出数据吗
struct c{
int i;
c(int){i=5;}
c(float) {cout<<17<<'';}
~c(){cout<<43<<'';}
void operator=(int){i=7;}
int m() {return 11;}
};
struct d:public c {
d():c('a'){}
d(int):c(1.0f){cout <<19<<'';}
~d() {cout <<41<<'';}
int m() {return 13;}
int n() const {return 31;}
int n(){return 37;}
}
ostream & operator<<(ostream &s,const d&)
{
return s<<23<<'';
}
int main(int argc, char* argv[])
{
c x(1);
cout <<"a:"<<x.i<<endl;
c y=2;
cout <<"b:"<<y.i<<endl;
d z;
c &r =z;
cout <<"c:"<<r.m()<<endl;
cout <<"d:"<<d(1)<<endl;
cout <<"e:"<<z.n()<<endl;

return 0;
}
...全文
1324 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
manplus 2006-07-17
  • 打赏
  • 举报
回复
mrk
Soft_micro 2006-06-21
  • 打赏
  • 举报
回复
我最讨厌笔试。
LiuYinChina 2006-06-21
  • 打赏
  • 举报
回复
运行一下不就知道了?
lircstar 2006-06-21
  • 打赏
  • 举报
回复
haha!!!strong
abblly 2006-06-21
  • 打赏
  • 举报
回复
to Cody2k3()
我这里也没有gcc的编译器,不过c++标准确实没有规定参数传递的顺序,这一点在TCPL里面强调了的,不过运算符的优先级和求值顺序是有明确规定的,<<是运算符,即使重载了也不会改变优先级和运算顺序,所以会有这个结果。


gogowhy 2006-06-21
  • 打赏
  • 举报
回复
m
wqy0001 2006-06-21
  • 打赏
  • 举报
回复
如果我们把这一句:cout <<"e:"<<z.n()<<endl;去掉
则输出结果的最后一行数字变成了41 43 41 43 43 43,也就是说多析构了一个d不知道为什么

另外提两个比较傻的问题,各位见笑

第一
ostream & operator<<(ostream &s,const d&)
{

return s<<23<<" ";
}
中const d&中的d是不是代表struct d还是代表的仅仅是这么一个同名符号

第二
怎样才可以调用 int n() const {return 31;}函数 成功

不胜感激!

whaway 2006-06-21
  • 打赏
  • 举报
回复
析构的无法给出了。
whaway 2006-06-21
  • 打赏
  • 举报
回复
结果
a:5
b:5
c:11
1719d:23
4143e:37
whaway 2006-06-21
  • 打赏
  • 举报
回复
//GCC上编译通过的代码
#include <iostream>
using namespace std;
struct c
{
int i;
c(int)
{
i = 5;
};
c(float)
{
cout << 17 << ' ';
};
~c()
{
cout << 43 << ' ';
};
void operator = (int)
{
i = 7;
};
int m()
{
return 11;
};
};
struct d: public c
{
d(): c('a'){}
;
d(int): c(1.0f)
{
cout << 19 << ' ';
};
~d()
{
cout << 41 << ' ';
};
int m()
{
return 13;
};
int n()const
{
return 31;
};
int n()
{
return 37;
};
};
ostream &operator << (ostream &s, const d &)
{
return s << 23 << ' ';
};
int main(int argc, char *argv[])
{
c x(1);
cout << "a:" << x.i << endl;
c y = 2;
cout << "b:" << y.i << endl;
d z;
c &r = z;
cout << "c:" << r.m() << endl;
cout << "d:" << d(1) << endl;
cout << "e:" << z.n() << endl;
system("pause");
return 0;
}
Cody2k3 2006-06-21
  • 打赏
  • 举报
回复
vc下编译把所有的''变成' ', 中间加个空格.
mygoodday 2006-06-21
  • 打赏
  • 举报
回复
发现高手还是很多,而自己却在这方面锻炼的比较少,一看题目就有点乱糟糟的。
vc下编译好像不行,如果能跟踪数据的话还是可以慢慢体会。但是笔试题就是要看文字理解,写答案。
addwing 2006-06-21
  • 打赏
  • 举报
回复
留念,学习。。。。。。。。。。。接分
hz张三 2006-06-20
  • 打赏
  • 举报
回复
真恶心的公司,招进去的员工要是都写这样晦涩的代码。
嘿嘿。。。
wanderfox 2006-06-20
  • 打赏
  • 举报
回复
又长见识了,up
c y=2;
如果分成
c y;
y = 2;
结果就是b:7了
还需要给c加个构造函数c()
Cody2k3 2006-06-20
  • 打赏
  • 举报
回复
另, 引用那个是我记错了, 丢人了, 呵呵
Cody2k3 2006-06-20
  • 打赏
  • 举报
回复
to abblly(), 说函数压栈是个比喻, 我很怀疑不同编译器上有不同结果.
而且好像标准c和c++都是缺省使用_cdecl, 你要是手头有gcc,可以试试.
abblly 2006-06-20
  • 打赏
  • 举报
回复
cout输出序列参数从右向左压栈, (当成函数调用好了, 不信可以试试int k=0; cout<<k++<<k++<<k++;),

c++标准里面没有定义参数压栈的顺序的,所以cout<<k++<<k++<<k++;是未定义的行为,不同编译器上应该是不同的结果的。
abblly 2006-06-20
  • 打赏
  • 举报
回复
to:Cody2k3() ( )

d z; c &r =z;
d的缺省构造函数d()被调用, c('a')被调用, 寻找匹配的c构造函数得到c(int), z.i=5;
r 为 c类型的引用, 引用不发生多态, c::m() 被调用, 输出 c:11


不是说引用不发生多态,是因为C里面m不是虚函数,所以不发生多态,如果m为虚函数的话,还是多态的,引用和指针一样,都会有多态
abblly 2006-06-20
  • 打赏
  • 举报
回复
int n() const {return 31;}
int n(){return 37;}
类里面用同名的这个函数,没见过阿,真晕,才看出来是怎么回事。
加载更多回复(10)

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧