Win32/C++程序员面试考试题(转)
一、单项选择题:(共12题,每题2分,共24分)
1. 下面哪一个不是C++的标准数据类型? (C)
A. int B. char
C. bool D. real
2. break关键字在哪一种语法结构中不能使用? (C)
A. for语句 B. switch语句
C. if语句 D. while语句
3. 类的继承方式有几种? (B)
A. 两种 B. 三种
C. 四种 D. 六种
4. extern关键字的作用是什么? (D)
A. 声明外部链接 B. 声明外部头文件引用
C. 声明使用扩展C++语句 D. 声明外部成员函数、成员数据。
5. C库函数strstr的功能是? (A)
A. 查找子串 B. 计算字符串长度
C. 字符串比较 D. 连结字符串
6. stl::deque是一种什么数据类型? (?)
A. 动态数组 B. 链表
C. 堆栈 D. 树
7. STL库里含有下面的哪一种泛型算法? (D)
A. KMP查找 B. 折半查找
C. 冒泡排序 D. 快速排序
8. 现在最快且最通用的排序算法是什么? (A)
A. 快速排序 B. 冒泡排序
C. 选择排序 D. 外部排序
9. Win32下的线程的哪一种优先级最高? (C)
A. THREAD_PRIORITY_HIGHEST B. THREAD_PRIORITY_IDLE
C. THREAD_PRIORITY_TIME_CRITICAL D. THREAD_PRIORITY_ABOVE_NORMAL
10. 下面四个选项中,哪一个不是WinMain函数的参数? (D)
A. HINSTANCE B. INT
C. LPSTR D. WPARAM
11. VC++的编译器中,运算符new底层的实现是什么? (?)A?B?
A. VirtualAlloc() B. HeapAlloc()
C. GlobalAlloc() D. AllocateUserPhysicalPages()
12. 下面哪一本C++参考书最厚? (C)
A. 《Think in C++》 B. 《深入浅出MFC》
C. 《C++ Primer》 D. 《Effective C++》
注:(C>A>B>D,Think In C++没看过,Think in Java比C++ Primer薄)
二、不定项选择题:(共6题,每题3分,共18分,多选、错选、漏选均不给分)
1. vector::iterator重载了下面哪些运算符? (?)
A. ++ B. >>
C. *(前置) D. ==
2. CreateFile( )的功能有哪几个? (AB)
A. 打开文件 B. 创建新文件
C. 文件改名 D. 删除文件
3. 下面哪些是句柄(HANDLE)? (ABCD)
A. HINSTANCE B. HWND
C. HDC D. HFONT
4. 下面哪些不是OpenGL标准几何元素的绘制模式? (A)
A. GL_FOG B. GL_LINE_STRIP
C. GL_POINTS D. GL_TRIANGLE_FAN
5. 下面哪些运算符不能被重载? (B)
A. 做用域运算符“::” B. 对象成员运算符“.”
C. 指针成员运算符“->” D. 三目运算符“? :”
注:什么叫做运算符号重载?
6. 下面哪些人曾参与了世界上第一个C++编译器的开发? (?)
A. Bill Gates B. Stanley Lippman
C. Anderson Hejlsberg D. Bjarne Stroustrup
三、填空题:(共8题,每题3分,共24分)
1. 一个大小为320 X 192,颜色为灰度索引色的设备相关位图有 [ ] 字节。如果此位图颜色为24位真彩色,则它的大小有 [ ] 字节。
2. Windows API的中文意义是 [Windows 应用程序接口]。
3. 计算反正弦的库函数是 [asin()];计算浮点数绝对值的库函数是 [fabs()];计算浮点数n次方的库函数是 [pow()];将浮点数转化为字符
串的库函数是 [fcvt()]。
4. 如果i等于5,那么( ++i ) - -的返回值是 [6] 。
5. API LoadBitmap()的功能是从 [ 指定的模块和或应用程序实例 ] 中读取位图数据到内存。
6. new和 [delete] 对应,malloc和 [free] 对应,他们之间 [不能] 交叉混用。calloc的功能是 [为数组动态分配内存],realloc的功能是
[改变原有内存区域的大小]。
7. SendMessage和PostMessage都会向窗体发送一个消息,但SendMessage____将一条消息发送到指定窗口,立即处理_____
而PostMessage______将一条消息投递到指定窗口的消息队列,不需要立即处理______。
8. 输出指定圆心、半径、边数的圆上的点:
const int nCount = 12;
const double dOrgX = 5.0,
dOrgY = 3.0;
const double dRadius = 2.0;
for( int i = 0; i < nCount; i++ )
{
double dAngle = M_PI * 2.0 / (double)nCount * i;
cout << "第" << i << "点:X = " << ________; cout << ", Y = " << __________ << endl;
}
三、判断题:(共12题,每题2分,共24分)
1. 一个类必须要有一个不带参数的构造函数。 □错
2. 你不能写一个虚的构造函数。 □对
3. 类里面所有的函数都是纯虚函数时才是纯虚类。 □错
4. const成员函数对于任何本类的数据成员都不能进行写操作。 □对
5. 函数中带默认值的参数必须位于不带默认值的参数之后。 □???
6. char *p = "Test"; p[0] = 'R'; □错
7. cout << "Test"; □???
8. stl::list不支持随机访问叠代器。 □对
9. stl::vector的效率比stl::list高。 □错
10. VC和VC++是一回事,而VC++是一种比C++更难一些的语言。 □错
11. 理论上,new和malloc造成的内存泄露都会由操作系统回收。 □错
12. 在C++中struct和class的差别很大,所以从语法上不能混用。 □对
四、简述题(共3题,每题5分,共15分)
1. 请简述PeekMessage和GetMessage的区别。
答: Peekmessage和Getmessage都是向系统的消息队列中取得消息,两个函数的不同在于取不到消息的时候,若Getmessage()向消息队列中取
不到消息,则程序的主线程会被OS(操作系统)挂起,等到有合适的消息时才返回;若是用Peekmessage()在消息队列中取不到消息,则程序会
取得OS控制权,运行一段时间。
另外,在处理消息的时候,GetMessag()会将消息从队列中删除,而PeekMessage()可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列
中。
2. 请列出你所知道的在Windows SDK平台上,实现计时功能的方法。
答:可以使用SetTimer函数创建一个计时器,SetTimer的函数原型如下:
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc )
3. 请简述你所知道的const的各种用法。
const 常量
const 修饰类的数据成员
const 修饰指针
const 应用在函数声明中
const 应用在类成员函数
五、编程题:(共3题,第1小题7分,第2小题14分,第3小题24分)
1. 深度遍历二叉树。
struct Node
{
Node *Parent;
Node *Left, *Right;
};
void Through(Node *Root)
{
}
答案:
void Through(Node* Root){
if(Root){
Through(Root->Left);
Through(Root->Right);
//visit Root.
}
}
2. 二分法查找。
int DicFind( int *Array, int Count, int Value )
{
}
答案:
int DicFind(int* Array, int Count, int Value){
int start = 0;
int end = Count-1;
int mid = 0;
while(start <= end){
mid = (start+end)/2;
if(Array[mid] > Value){
end = mid-1;
}else if(Array[mid] < Value){
start = mid+1;
}else{
return mid;
}
}
return -1;
}
3. 写出字符串类String的默认构造函数、析构函数和重载赋值运算符。
已知类String的原型为:
class String
{
public:
String( const char *pStr = NULL ); // 默认构造函数
~String( void ); // 析构函数
String &operate = ( const String &Source ); // 重载赋值运算符
private:
char *m_pData; // 指向字符串的指针
};
答案:
String::String( const char *pStr = NULL )
:m_pData(NULL)
{
if(pStr){
int nLen = strlen(pStr);
m_pData = new char[nLen+1];
if(m_pData){
memcpy(m_pData, pStr, (nLen+1)*sizeof(char));
}
}
}
String::~String( void ){
if(m_pData){
delete[] m_pData;
m_pData = NULL;
}
}
String &String :: operator= ( const String &Source )
{
if(&Source == this)
return *this;
if(m_pData){
delete[] m_pData;
m_pData = NULL;
}
if(Source.m_pData){
int nLen = strlen(pStr);
m_pData = new char[nLen+1];
if(m_pData){
memcpy(m_pData, pStr, (nLen+1)*sizeof(char));
}
}
}
答案仅供参考!!!!