几道C++面试题不明白,请教下

小驴 2011-08-30 10:21:21

1.下面的代码有什么问题?

class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};



答:
会引起无限递归 //为什么呢?请具体解释下


---------------------------------------------------


2.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数


//16位的系统下,
int i = 65536;
cout << i; // 输出0;???
int i = 65535;
cout << i; // 输出-1;???
32位的系统下,
int i = 65536;
cout << i; // 输出65536;
int i = 65535;
cout << i; // 输出65535;



16位系统的整形的范围是多少到多少?
输出0,可以理解,但是输出-1的话就不好理解?具体解释下吧。


-----------------------------------------------

3.

class A
{
char a;
int b;
double c;
};
cout<<"A :"<<sizeof(A)<<endl;//16???



空类是1;
只有一个char a 是1;
只有一个int b 是8?怎么回事?
只有一个double c 是8;
三个合起来是16???

-----------------------------------------------

4.
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout << "fun1 in class B" << endl;}
virtual void func2(){cout << "fun2 in class B" << endl;}
}
A, A中的func1和B中的func2都是虚函数.
B, A中的func1和B中的func2都不是虚函数.
C, A中的func2是虚函数.,B中的func1不是虚函数.
D, A中的func2不是虚函数,B中的func1是虚函数.// 这个是对的吧,B中的func1不是继承了A了吗?
答:
A
--------------------------------------

5.试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序


bool IsBigendian()
{
unsigned short usData = 0x1122;
unsigned char *pucData = (unsigned char*)&usData;
return (*pucData == 0x22);
}


是不是内存高位存了0x11,低位存了0x22,在转换为unsigned char的时候,只截取了低位的0x22?
...全文
3934 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
White_MouseCSND 2011-09-28
  • 打赏
  • 举报
回复
5.试编写函数判断计算机的字节存储顺序是升序(little endian)还是降序
答:我觉得用下面的函数测一下,显示的结果一目了然!
void TestInt()
{
int number=0x11223344;
char *p=(char *)number;
printf("(%X %X) (%X %X) (%X %X) (%X %X)",p,*p,p+1,*(p+1),p+2,*(p+2),p+3,*(p+3));
}

White_MouseCSND 2011-09-27
  • 打赏
  • 举报
回复
class A
{
char a;
int b;
double c;
};
cout<<"A :"<<sizeof(A)<<endl;

这个题的输出肯定是16无疑。因为char a是1,int b是4,double c是8;如果类中的数据成员分别只有一个,结果就分别为1、4、8。如果只有char a和int b,那就是8了,因为要按数据成员最大的字节要求成倍娄计算!不信你可以在char a中增加一个变量成为char a,t,结果会仍然是8。double c的字节需求是8,而char a和int b总共的字节需求是5还不不够8,按8算,所以结果是16。不信你再试试,在int b里增加一个变量使之成为int b,k,前两行的需求是9,后一行的需求是8,结果就只好是24了,哈哈……
ShineBond 2011-09-04
  • 打赏
  • 举报
回复

class A
{
public:
A() { p=this; }
~A() { p=NULL; }
A* p;
};

懿德 2011-09-04
  • 打赏
  • 举报
回复
哇塞,这些都得深入理解呀
sunshienmyson 2011-09-03
  • 打赏
  • 举报
回复
关于那个虚函数,我想说如果选function2不是虚函数,那要是从B再派生一个C类,function2是不是还是可以使用虚函数的性质呢。我觉得是可以的哈
低头思蚊香 2011-09-02
  • 打赏
  • 举报
回复
5.试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序

C/C++ code
bool IsBigendian()
{
unsigned short usData = 0x1122;
unsigned char *pucData = (unsigned char*)&usData;
return (*pucData == 0x22);
}



是不是内存高位存了0x11,低位存了0x22,在转换为unsigned char的时候,只截取了低位的0x22?
pucData指向低字节,然后判断低位字节存的是什么,低位字节存数字的低8位就是升序,低位字节存数字的高8位就是降序。
yclhit 2011-09-02
  • 打赏
  • 举报
回复
第一题会因为delete会导致无限析构,最终会因为堆栈溢出导致程序崩溃。
cherrygarden 2011-09-02
  • 打赏
  • 举报
回复
哈哈~学习了 7楼讲的很好!~~
Scandinavians 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 wangxiaotao1980 的回复:]
大家注意点,第四题类的继承是:私有的继承。
本质上讲私有继承算不上继承,诸位在想想吧。
题算不上难,但是出的不算好。
[/Quote]感觉挺有道理
小驴 2011-09-02
  • 打赏
  • 举报
回复
貌似都解释通了,赶紧结贴了...
没玩法了 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 hunzhihen 的回复:]

引用 35 楼 cp298674954 的回复:

class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};

Delete 会调用析构函数

2.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数

C/C++ cod……
[/Quote]
嘎,错了,最大正整数是32767,最小的负数是-32768
没玩法了 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 cp298674954 的回复:]

class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};

Delete 会调用析构函数

2.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数

C/C++ code

//16位的系统下,
……
[/Quote]


十进制65535转化为二进制是1111 1111 1111 1111。在16位系统中,首位是符号位,1为负0为正,最大正整数为32768,那么1111 1111 1111 1111 转为十进制的算法是 -1*2^15 + 1*2^14 + 1*2^13 + …… + 1*2^1 + 1*2^0 = -1
yifei0 2011-09-01
  • 打赏
  • 举报
回复
你面试的是C语言做网络交换的吧……看着这么像华为的题目呢……
yifei0 2011-09-01
  • 打赏
  • 举报
回复
第三题其实是题目不完整,看是几字节对齐了,如果单字节对齐是1 + 4 + 8 = 13, 如果是四字节对齐是 4 + 4 + 8 = 16……
cug113062 2011-09-01
  • 打赏
  • 举报
回复
每天回帖,有10分奖励
hzhxxx 2011-09-01
  • 打赏
  • 举报
回复


B 中的 func1 把 A 的 func1 隐藏了。
cp298674954 2011-09-01
  • 打赏
  • 举报
回复
class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }
A* p;
};

Delete 会调用析构函数

2.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数

C/C++ code

//16位的系统下,
int i = 65536;
cout << i; // 输出0;???
int i = 65535;
cout << i; // 输出-1;???
32位的系统下,
int i = 65536;
cout << i; // 输出65536;
int i = 65535;
cout << i; // 输出65535;




16位系统的整形的范围是多少到多少?
输出0,可以理解,但是输出-1的话就不好理解?具体解释下吧。

这题有问题 系统位数 和整形长度并没有直接联系 ANSI 没有这方面的标准



C/C++ code

class A
{
char a;
int b;
double c;
};
cout<<"A :"<<sizeof(A)<<endl;//16???




空类是1;
只有一个char a 是1;
只有一个int b 是8?怎么回事?
只有一个double c 是8;
三个合起来是16???

-----------------------------------------------

内存对其


4.
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout << "fun1 in class B" << endl;}
virtual void func2(){cout << "fun2 in class B" << endl;}
}
A, A中的func1和B中的func2都是虚函数.
B, A中的func1和B中的func2都不是虚函数.
C, A中的func2是虚函数.,B中的func1不是虚函数.
D, A中的func2不是虚函数,B中的func1是虚函数.// 这个是对的吧,B中的func1不是继承了A了吗?
答:
A
这个题 肯定是错的 B中的都是虚函数 即使是 private继承 也是虚的啊





小驴 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 wangxiaotao1980 的回复:]

大家注意点,第四题类的继承是:私有的继承。
本质上讲私有继承算不上继承,诸位在想想吧。
题算不上难,但是出的不算好。
[/Quote]
这个解释比较合理
小驴 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 yifei0 的回复:]

你面试的是C语言做网络交换的吧……看着这么像华为的题目呢……
[/Quote]

不是,公司是搞安卓和iphone开发的...
xiaolomg 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wry2008wry 的回复:]

3 第三题目自己总结了个规律:
a 每个成员的首地址必须是min(自己的大小,指定的对齐数)的整数倍。
b 整个结构的大小必须是min(最大成员大小,指定的对齐数)的整数倍。
[/Quote]
这个总结好,mark!
加载更多回复(43)

64,637

社区成员

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

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