小明思考

高性能服务器端计算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

考考你对C++对象模型的理解

Posted on 2005-12-06 09:34 小明 阅读(2334) 评论(12)  编辑 收藏 引用 所属分类: C/C++
这是小明我自编的题目。

1.请在不运行程序的情况下,说出下面的程序运行后会崩溃么?如果是,在哪一行。

 1 #include <stdio.h>
 2 #include <memory.h>
 3 class Test 
 4 
 5 public
 6         Test() 
 7         { 
 8                 memset(this,0,sizeof(*this)); 
 9         } 
10         int s; 
11         void test() 
12         { 
13                 printf("test()\n"); 
14         }
15         void test1() 
16         { 
17                 printf("test1():%d\n",this->s); 
18         }
19         virtual void test2() 
20         { 
21                 printf("test2()\n"); 
22         }
23 }; 
24 
25 int main() 
26 
27         Test *s; 
28         s->test(); 
29         s->test2(); 
30         s->test1(); 
31         return 0
32 }

2 .修改一下,又是在哪一行呢?

 1 #include <stdio.h>
 2 #include <memory.h>
 3 class Test 
 4 
 5 public
 6         Test() 
 7         { 
 8                 memset(this,0,sizeof(*this)); 
 9         } 
10         int s; 
11         void test() 
12         { 
13                 printf("test()\n"); 
14         }
15         void test1() 
16         { 
17                 printf("test1():%d\n",this->s); 
18         }
19         virtual void test2() 
20         { 
21                 printf("test2()\n"); 
22         }
23 }; 
24 
25 int main() 
26 
27         Test *= new Test(); 
28         s->test(); 
29         s->test1(); 
30         s->test2(); 
31         return 0
32 }

3.再修改一下,情况会如何呢?
 1 #include <stdio.h>
 2 #include <memory.h>
 3 class Test 
 4 
 5 public
 6         Test() 
 7         { 
 8                 memset(this,0,sizeof(*this)); 
 9         } 
10         int s; 
11         void test() 
12         { 
13                 printf("test()\n"); 
14         }
15         void test1() 
16         { 
17                 printf("test1():%d\n",this->s); 
18         }
19         virtual void test2() 
20         { 
21                 printf("test2()\n"); 
22         }
23 }; 
24 
25 int main() 
26 
27         Test s ;
28         s.test(); 
29         s.test1(); 
30         s.test2(); 
31         return 0
32 }




最后说一下答案吧
第一题是在29行,第二题在30行,最后一题不报错。
如果你不知道为什么,建议看看<<Inside the c++ Object Model>>

Feedback

# re: 考考你对C++对象模型的理解  回复  更多评论   

2005-12-06 13:19 by 芋头
这题挺有意思的,呵呵。
再加一个:
int main()
{
Test s ;
Test* s1 = &s;
s1->test();
s1->test1();
s1->test2();
return 0;
}

# re: 考考你对C++对象模型的理解  回复  更多评论   

2005-12-22 10:00 by LiaoLiaoPro
简单。

Test()
{
memset(this,0,sizeof(*this));
}

  构造函数中,把对象所在的内存块置为了0。而对象中含有虚函数,所以指向虚函数表的vptr指针也被置为了0。

  前两种调用都是通过指针进行调用,用指针或引用(楼上的例子)调用虚函数时会通过vptr指针间接调用,通过对象调用则不会。所以1,2出错。3不出错。

在1中,楼主把test1放在test2后调用,是为了让test2出错吧,呵呵。因为test1放在上面的话,在test1中就出错了(引用了this指针,但this却是个野指针。)

# re: 考考你对C++对象模型的理解  回复  更多评论   

2006-03-03 17:00 by 笑笑生
题很好啊,赞一个

# re: 考考你对C++对象模型的理解  回复  更多评论   

2006-03-09 16:35 by september_29
我的QQ是 417522707 精通了 Cpp Obj Model,但是苦于无人交流,周围的都是群,不知道我在说什么的研究生,希望能与你交个朋友

# re: 考考你对C++对象模型的理解  回复  更多评论   

2006-03-10 14:48 by init
也可以s1->Test::test2(), 则不会根据vptr指针来invoke function.

# re: 考考你对C++对象模型的理解  回复  更多评论   

2006-03-11 10:15 by init
例子1跟有无memset()没关系,根本没产生对象,test()和test1()代码独立于Test对象,而test2()必须由对象中的vptr来调用(除非使用Test::test2())。如果要强调memset的影响,main()中这样: Test*s = new Test()

# re: 考考你对C++对象模型的理解  回复  更多评论   

2006-05-31 09:11 by Neo
建议以后出题的时候的类名用 A,B,C,
函数名用fun,

不觉得 test() & Test() 很像吗,还是在故意考验大家的眼力?

# re: 考考你对C++对象模型的理解  回复  更多评论   

2008-04-30 11:02 by 疯子
用这句一切都OK了memset((char *)this + 4,0,sizeof(*this) - 4);

# re: 考考你对C++对象模型的理解  回复  更多评论   

2008-07-26 08:02 by lengbufang
哦哦!!

# re: 考考你对C++对象模型的理解  回复  更多评论   

2009-08-08 01:45 by 周龙亭
不要用C语言的方法来写C++程序

# re: 考考你对C++对象模型的理解  回复  更多评论   

2009-09-03 14:12 by yyu
用这句一切都OK了memset((char *)this + 4,0,sizeof(*this) - 4);
C++里没有规定vptr的存放位置,所以你句修改对于不同的编译器可能出错

# re: 考考你对C++对象模型的理解  回复  更多评论   

2009-09-16 11:54 by yilog
你们用的是什么编译器?第一个程序,那s没指向,直接在28行就宕掉了,不是这样的么,我用的vs2005是这样的。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理