Redian新闻
>
关于c++的constructor的面试题
avatar
关于c++的constructor的面试题# Programming - 葵花宝典
w*u
1
请教各位,最近公司答应给办PERM,非常高兴。不过,忽然又发现公司另一个同事也在
办PERM,他的职位和我的类似,但是具体内容不一样。当然,我也不指望DOL的人会非
常清楚之间的区别。
我的问题是:
这种情况的话,有没有可能被审查或是被拒,我是不是应该等上一阵,把时间错开?
avatar
a*8
2
歌词不仅很美很文采飞扬,而且每一句都含水(有水部首文字)。
【若水杭州】
演唱:陈艺鹏
作词:黄荣章
作曲:黄晓亮
荷青池凉 雾凝露 沐雨天
蓬心润 波光漩
楼外楼 山外山 泛歌轻舟间
沉鱼跃 涟漪万千
豆蔻年 桃花颜 酒窝深若浅
水花缘 幽兰才子怜
泪点点 濯清泉 叮咚迷人眼
泣声于犹豫处听见
谁在那西湖边 推开朱木窗
红桃青柳 苏堤依旧
只是春水不堪剪
谁在那百花间 辗转风月前
钱塘一梦 西泠桥终
慕才亭前 叹无缘香渐
忆江南 纪苏杭 水榭前
飘零燕 飞不倦
凭栏木 已作古 濛濛烟雨绵
酌玉液 寂寥一夜
望不穿 理还乱 漂泊不停歇
青楼薄幸 心结难解
恨水空 去匆匆 旧情谁人恋
悠长伤感若水寄思念
谁在那西湖边 推开朱木窗
红桃青柳 苏堤依旧
只是春水不堪剪
谁在那百花间 辗转风月前
钱塘一梦 西泠桥终
慕才亭前 叹无缘对缘
酣睡在那十里荷花香沁间
玉指浮动绿水声声入愁眠
我在那云水间 一曲祭吴越
嬉笑结霜 苦泪化雪
散落雨湖面 荷花香沁间
西湖边 听静水无言
可溯回 似水度岁月
声声入愁眠
陈艺鹏:
avatar
mw
3
为什么member的constustrctor会比class constructor先调用,奇怪啊
下面code的输出居然是a c b,不解,望赐教
#include
#include
using namespace std;
class a{
public:
a(){cout<};
class c{
public:
c(){cout<};
class b: public a{
public:
b(){cout<c instc;
};
int main(int argc, char *argv[])
{
system("PAUSE");
b instb;

return EXIT_SUCCESS;
}
avatar
i*t
4
it does not matter

【在 w*****u 的大作中提到】
: 请教各位,最近公司答应给办PERM,非常高兴。不过,忽然又发现公司另一个同事也在
: 办PERM,他的职位和我的类似,但是具体内容不一样。当然,我也不指望DOL的人会非
: 常清楚之间的区别。
: 我的问题是:
: 这种情况的话,有没有可能被审查或是被拒,我是不是应该等上一阵,把时间错开?

avatar
w*g
5
你怎么知道cout << "b" << endl; 是b()做的第一件事?
正确的理解是b()在调用cout << "b" << endl;之前先调用了a(), 然后逐个调用
member constructor。这些东西可以在b()的初始化列表中显式指定,但不要认为你不
给初始化列表它们就不在了。弄完这些b()才开始执行函数体里你给出的代码。
真正的顺序是b a c。

【在 mw 的大作中提到】
: 为什么member的constustrctor会比class constructor先调用,奇怪啊
: 下面code的输出居然是a c b,不解,望赐教
: #include
: #include
: using namespace std;
: class a{
: public:
: a(){cout<: };
: class c{

avatar
h*z
6
You must first create the parts before you can build the whole thing.

【在 mw 的大作中提到】
: 为什么member的constustrctor会比class constructor先调用,奇怪啊
: 下面code的输出居然是a c b,不解,望赐教
: #include
: #include
: using namespace std;
: class a{
: public:
: a(){cout<: };
: class c{

avatar
s*e
7
前面都很同意,只是怎么结论给的很诡异呢?

【在 w***g 的大作中提到】
: 你怎么知道cout << "b" << endl; 是b()做的第一件事?
: 正确的理解是b()在调用cout << "b" << endl;之前先调用了a(), 然后逐个调用
: member constructor。这些东西可以在b()的初始化列表中显式指定,但不要认为你不
: 给初始化列表它们就不在了。弄完这些b()才开始执行函数体里你给出的代码。
: 真正的顺序是b a c。

avatar
w*g
8
函数执行的顺序是b a c,但是输出的是 a c b。编译器生成的b()的代码应该对应的是
b()
{
a(); //自动加入
c(); //自动加入
cout << "b" << endl;
}
所以调用b()时反而先输出了a c。
如果认为自动加入那部分不是构造函数的一部分,那么得出的执行顺序应该是a c b,
但是我觉得这么理解不妥。

【在 s***e 的大作中提到】
: 前面都很同意,只是怎么结论给的很诡异呢?
avatar
s*e
9
现在明白了,呵呵,怎么说来着,it's more than clear now.
主要是我们如果用顺序的方式去解释,就没法反映其中的层次。而把compiler生成的整个函数体写出来之后,就清晰多了。
刚才很有兴趣的用Java也测试了一下,发现结果是一样的。不过把virtual函数放到constructor之后就有不同的效果了。
C++输出是:
a
a.f()
c
b
Java输出是:
a
b.f()
c
b
// =========== C++ Implementation ===========
#include
#include
using namespace std;
class a{
public:
a(){cout<virtual f() {cout<};
class c{
public:
c(){cout<};
class b: public a {
public:
b(){cout<virtual f() {c

【在 w***g 的大作中提到】
: 函数执行的顺序是b a c,但是输出的是 a c b。编译器生成的b()的代码应该对应的是
: b()
: {
: a(); //自动加入
: c(); //自动加入
: cout << "b" << endl;
: }
: 所以调用b()时反而先输出了a c。
: 如果认为自动加入那部分不是构造函数的一部分,那么得出的执行顺序应该是a c b,
: 但是我觉得这么理解不妥。

avatar
K*n
10
If you debug into disassembly, you will see that
a constructor and c constructor are inserted in the front of b constructor
body. That is why you get a, c, b.
class b: public a{
public:
b(){cout<004117C0 push ebp
004117C1 mov ebp,esp
004117C3 sub esp,0CCh
004117C9 push ebx
004117CA push esi
004117CB push edi
004117CC push ecx
004117CD lea edi,[ebp-0CCh]
004117D3 mov ecx,33h
004117D8 mov eax,0CC
avatar
O*d
11
The sequence of call is b(), a(), c(). a() and c() are called before line
cout<followed by cout << "b"
avatar
h*z
12
You can interpret it that way, though I think the more common interpretation
is that a and c are constructed automatically before b() is called.

【在 w***g 的大作中提到】
: 函数执行的顺序是b a c,但是输出的是 a c b。编译器生成的b()的代码应该对应的是
: b()
: {
: a(); //自动加入
: c(); //自动加入
: cout << "b" << endl;
: }
: 所以调用b()时反而先输出了a c。
: 如果认为自动加入那部分不是构造函数的一部分,那么得出的执行顺序应该是a c b,
: 但是我觉得这么理解不妥。

avatar
n*d
13
What is the reason that C++ and Java call different f()?

整个函数体写出来之后,就清晰多了。
constructor之后就有不同的效果了。

【在 s***e 的大作中提到】
: 现在明白了,呵呵,怎么说来着,it's more than clear now.
: 主要是我们如果用顺序的方式去解释,就没法反映其中的层次。而把compiler生成的整个函数体写出来之后,就清晰多了。
: 刚才很有兴趣的用Java也测试了一下,发现结果是一样的。不过把virtual函数放到constructor之后就有不同的效果了。
: C++输出是:
: a
: a.f()
: c
: b
: Java输出是:
: a

avatar
t*t
14
我前两天没注意到这个贴. java怎样我是不知道, C++里在constructor或destructor里
调用virtual function 是undefined

整个函数体写出来之后,就清晰多了。
constructor之后就有不同的效果了。

【在 s***e 的大作中提到】
: 现在明白了,呵呵,怎么说来着,it's more than clear now.
: 主要是我们如果用顺序的方式去解释,就没法反映其中的层次。而把compiler生成的整个函数体写出来之后,就清晰多了。
: 刚才很有兴趣的用Java也测试了一下,发现结果是一样的。不过把virtual函数放到constructor之后就有不同的效果了。
: C++输出是:
: a
: a.f()
: c
: b
: Java输出是:
: a

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。