cc
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
38 随笔 :: 14 文章 :: 21 评论 :: 0 Trackbacks
<
2024年8月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔档案
(38)
2013年3月 (1)
2011年5月 (1)
2011年2月 (3)
2010年3月 (2)
2010年2月 (1)
2010年1月 (4)
2009年12月 (2)
2009年11月 (5)
2009年10月 (4)
2009年7月 (1)
2009年6月 (2)
2009年5月 (2)
2009年4月 (1)
2008年10月 (1)
2008年9月 (1)
2008年8月 (1)
2008年7月 (3)
2007年12月 (2)
2007年7月 (1)
文章分类
(10)
编程相关(9)
(rss)
经典网评(1)
(rss)
文章档案
(14)
2008年7月 (1)
2006年12月 (13)
相册
cc
搜索
最新评论
1. re: 使用 .NET Remoting 实现并行计算 [转]
评论内容较长,点击标题查看
--EssaysService rewiew
2. re: 使用 .NET Remoting 实现并行计算 [转]
评论内容较长,点击标题查看
--custom essay writing services reviews
3. re: 使用 .NET Remoting 实现并行计算 [转]
评论内容较长,点击标题查看
--this link
4. re: C#中new和override区别
THX!
--programmer
5. re: 数据库水平分库框架设计
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
--aaaaaaaaaaaaaaaaaaaa
阅读排行榜
1. WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标(2465)
2. 空间中直线和三角面片求交(2402)
3. C# winform 实现(不规则)窗体或者控件的拖动(2320)
4. 保存Graphics对象到Bitmap对象 [转](2158)
5. 如何在Dll中导出STL类(1891)
评论排行榜
1. 数据库水平分库框架设计(2)
2. 如何在Dll中导出STL类(1)
3. CString和string的互相转换 (1)
4. C#中new和override区别 (1)
5. C++中extern “C”含义深层探索(1)
一道腾讯的面试题
class a
{
word m_a1;
word m_a2;
a(){m_a1=1;m_a2=2;}
void fun(){printf("%d,%d",m_a1,m_a2);}
}
class b
{
dword m_a3;
b(){m_a3=3;}
void fun(){printf("%d",m_a3);}
}
main()
{
a a;
b *pb;
pb=b*(&a);
pb->fun();
}
输出是什么?
posted on 2006-12-17 15:30
醒目西西
阅读(580)
评论(2)
编辑
收藏
引用
所属分类:
编程相关
评论
#
re: 一道腾讯的面试题
2006-12-17 15:30
醒目西西
结果是1
pb=(b*)(&A); 将A的地址传给了pb,并强制转化为b类的地址
pb->fun(); 调用b 的fun()方法,不过此时ma_3,是a类的ma_1,所以输出1
你可以改一下程序运行就知道了
#include <stdio.h>
class a
{
char m_a1;
char m_a2;
public:
a(){m_a1=1;m_a2=2;}
void fun(){printf("%d,%d",m_a1,m_a2);}
};
class b
{
char m_a3;
public:
b(){m_a3=3;}
void fun(){printf("%dggggg",m_a3);}//可以看出是调用了该方法
};
void main()
{
a A;
b *pb;
pb=(b*)(&A);
pb->fun();
}
回复
更多评论
#
re: 一道腾讯的面试题
2006-12-17 15:30
醒目西西
在win32和32位编译器的环境下,结构体(struct和class)中的数据域是按声明的先后顺序,“向上生长”的。就是说若结构体A中按先后声明了两个域a、b,则存放b的地址大与存放a的地址!注意,有些编译器为了提高在32位系统中对内存的访问速度,所以使用了内存对齐技术--结构体中的各个域是按4字节对齐的!
我们假设楼主提供的题目如下:
#include <stdlib.h>
#include <stdio.h>
class a {
short m_a1;
short m_a2;
public:
a() {
m_a1 = 1;
m_a2 = 2;
}
void fun() {
printf("%d,%d", m_a1, m_a2);
}
};
class b{
int m_a3;
b() {
m_a3 = 3;
}
public:
void fun() {
printf("%d", m_a3);
}
};
int main() {
printf("sizeof a, b = %d %d\n", sizeof(a), sizeof(b));
a a;
b *pb;
pb = (b*)(&a);
pb -> fun();
}
就是说,a的大小是8字节,b的大小是4字节!
而b::fun()就是按int的格式输出结构体中的前四个字节!所以输出1!
但是,若没有使用内存对齐技术!上面的问题就麻烦了!
a和b 的大小都是4字节!
a a+2
1 2 -> (2 << 16) | 1
所以应该输出:
131073
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
C++基本类型对象化的一个方案
[转]delegate 与 多线程
去腾讯时遇到的一个面试题
腾讯最新面试题,算法高手请进
一道腾讯的面试题
c#多线程教学(4):线程池和异步编程
c#.net多线程编程教学(2):Thread类
使用 .NET Remoting 实现并行计算 [转]
[C#学习]在多线程中如何调用Winform
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 醒目西西