程序员面试宝典
第十二章位运算与嵌入式编程
1.P161 面试例题3
每8个位(bit,简写为b)组成一个字节(Byte,简写为B),《21天学通C++》P40 表2-2
#include"StdAfx.h"
#include<Windows.h>
#include"../OpenGL/glut.h"
#include<iostream>
#include<fstream>
using namespace std;
#defineBIT_MASK(bit_pos) (0x01<<(bit_pos))
int Bit_Reset(unsignedint* val,unsigned char pos){
if(pos>=sizeof(unsignedint)*8)
{
return 0;
}
*val=(*val&~BIT_MASK(pos));
return 1;
}
int main(int argc, char*argv[])
{
unsigned intx=0xffffffff;
unsigned char y=4;
Bit_Reset(&x,y);
std::cout<<std::hex<<x<<'\n';
getchar();
return 0;
}
2.P161 面试例题2
#include"StdAfx.h"
#include<Windows.h>
#include"../OpenGL/glut.h"
#include<iostream>
#include<fstream>
using namespace std;
struct a{
int x:1;
int y:2;
int z:32;
};
int main(int argc, char*argv[])
{
a d;
double b;
cout<<&d;
//d.z=d.x+d.y;
printf("\n%d %d %d%d\n",d.x,d.y,d.z,sizeof(d));
printf("\n%d\n",sizeof(b));
getchar();
return 0;
}
3. C++中的强制类型转换
(1)static_cast
1--用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
2--用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
3--把空指针转换成目标类型的空指针。
4--把任何类型的表达式转换成void类型。
(2) dynamic_cast
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
(3)reinpreter_cast
type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
(4) const_cast
该运算符用来修改类型的const或volatile属性。除了const或volatile修饰之外,type_id和expression的类型是一样的。
常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
4.面试试题5
#include"StdAfx.h"
#include<Windows.h>
#include"../OpenGL/glut.h"
#include <iostream>
#include<fstream>
using namespace std;
int main(int argc, char*argv[])
{
char *p="a";
inti=(int)"a";
int i2=(int)p;
inti5=reinterpret_cast<int>(&p);
cout<<*p<<endl;
cout<<p<<endl;
cout<<&p<<endl;
cout<<i<<endl;
cout<<i2<<endl;
cout<<i5<<endl;
getchar();
return 0;
}
5.基本概念
(1)所谓虚函数,就是在基类声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。
(2)对一个数据可以建立一个“引用”,它的作用是为一个变量起一个别名。
int a;
int &b=a;
使变量b具有变量a的地址。
6.167页面试试题7
#include"stdafx.h"
#include<iostream>
#include <string>
using namespace std;
class A
{
public:
virtual voidfoo(){cout<<"A foo"<<endl;}
voidpp(){cout<<"A PP"<<endl;};
};
class B:public A
{
public:
voidfoo(){cout<<"B foo"<<endl;}
voidpp(){cout<<"B PP"<<endl;}
voidFunctionB(){cout<<"Excute FunctionB!"<<endl;}
};
int _tmain(int argc,_TCHAR* argv[])
{
B b;
A *pa=&b;
pa->foo();
pa->pp();
(dynamic_cast<B*>(pa))->FunctionB();
(dynamic_cast<B*>(pa))->foo();
(dynamic_cast<B*>(pa))->pp();
(*pa).foo();
getchar();
return 0;
}
7.168页面试试题8
#include"stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc,_TCHAR* argv[])
{
unsigned short int i=0;
int j=8,p;
p=j<<1;
i=i-2;
cout<<"\ni="<<i;
cout<<"\np="<<p;
getchar();
return 0;
}