您的位置:首页 > 编程语言 > C语言/C++

C++ 笔试题(一)

2013-05-15 16:56 267 查看
C++/MFC
试题


一.填空题 (26
分 )


1 . WIN32 平台下, sizeof(short) = __2__, sizeof(int) = __4__,
sizeof(long) = __4__。 (3分 )

2 .请给出如下程序的结果 (2
分 )

int a = 3;

int b = a << 3;

a = __3__ , b = __24__。

3 .请给出如下程序的结果 (2分 )

int aaa = 0x01;

htonl(aaa) = _16777216___
。 //这题运行显示的是16777216,我觉得可能是随机值

4 .请给出如下程序的结果 (2
分 )

#define MAX_NUM 100+200

int nTemp = MAX_NUM*10;

则 Temp = __2100__。

5 .请给出如下程序的结果 (3
分 )

char szTemp[1000] = "";

int nLen1 = sizeof(szTemp);

int nLen2 = strlen(szTemp);

strcpy(szTemp, "abc");

int nLen3 = sizeof(szTemp);

int nLen4 = strlen(szTemp);

int nTemp[100];

int *pTemp = nTemp;

int nLen5 = sizeof(pTemp);

char szResult[200] = "";

sprintf(szResult, "%d,%d,%d,%d,%02d.", nLen1, nLen2, nLen3, nLen4, nLen5);


则 szResult = ___1000,0,1000,3,04._


6 . MFC 中,大部分类是从哪个类继承而来( CCmdTarget、 CObject、 CWinApp、 CWnd)?
(2分 )__CObject __

7 .内存是进程范围 or
线程范围; ____

CPU 调度时,针对进程 or
线程; ____

函数调用堆栈,针对进程 or
线程。 ____(3 分 )

8 .调用函数 bbb 后,输出是什么 (4分 )

void ccc(int x)

{
char szTemp[10] = "";

x = 2;

sprintf(szTemp, "%d,", x);

afxDump << szTemp;

if(x = 3)
{
int x = 4;

sprintf(szTemp, "%d,", x);

afxDump << szTemp;
}

sprintf(szTemp, "%d,", x);

afxDump << szTemp;

}
void bbb()
{
char szTemp[10] = "";
int x = 7;
ccc(x);
sprintf(szTemp, "%d,", x);
afxDump << szTemp;
}


2,4,3,7

二.改错题 (
总共 15 分 ,
每题 5 分 )


1 .下面代码有何错误

void func1()
{
int *pa = NULL;

func2(pa);

delete pa;
}

void func2(int *pb)

{
pb = new int(5);
}


2 .下面代码有何错误

void func2(int *value)

{

*value = 2;

}

void func1()

{

int *p = 0;

func2(p);

}

3 .

int func1(int& b)
{
return 0;
}

void func2()
{
int bbb = 3;

func1(&bbb);

func1(bbb);
}

func2 中有何错误, func1
的参数 b 的类型是什么。

三.简答题 (64
分 )


1. 请简述 C 、 C++、 VC、 MFC在概念上的区别 (4分 )

2 .请写一个函数重载的简单例子 (4
分 )

3. 用什么函数开启新进程、线程。 (4
分 )

4.SendMessage 和 PostMessage
有什么区别 (4 分 )

5.WaitForSingleObject 有何作用; m_pThrd
的类型是 CWinThread* 时, WaitForSingleObject(m_pThrd->m_hThread, INFINITE);有何作用。 (4分 )

等待线程m_pThrd->m_hThread结束。

6. __stdcall 、 __cdecl
、 __pascal 在什么方面有所不同。 (4
分 )

函数调用规则不一样。

_cdecl,所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。编译器在编译的时候对这种调用规则的函数生成修饰名的时候,仅在输出函数名前加上一个下划线前缀,格式为_functionname。

_stdcall 按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。_stdcall是Pascal程序的缺省调用方式,通常用于Win32 API中。

__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number。如函数int func(int a, double b)的修饰名是_func@12

_pascal,这种规则从左向右传递参数,通过EAX返回,堆栈由被调用者清除。

7 .请把下述代码加上异常处理。 (6
分 )

int MyWriteFile(CString strFileName, CString strText)
{

int nRet = 0;
CFile myFile;

myFile.Open(strFileName, CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate, NULL);
int nLen = strText.GetLength();

myFile.Write((char*)(LPCSTR)strText, nLen);
myFile.Close();
return nRet;
}


8 .请解释“ func ”为何种类型,这种类型的作用什么,变量 ttt的值是多少? (6分 )

typedef int (*func)(int, int*);

int xxx(int a, int *p)

{

return a + *p;

}

int dowork(func aaa, int bbb, int *ccc)

{

return aaa(bbb, ccc);

}

int sss = 4;

int ttt = dowork(&xxx, 3, &sss);


9 .请问下述代码中 : int operator+(…
)起什么作用? this 是什么? ccc
的值最终为多少? (6 分 )

class Fruit

{

public:

Fruit()

{

weight = 2;

}

Fruit(int w)

{

weight = w;

}

int operator+(Fruit f)

{

return this->weight * f.weight;

}

private:

int weight;

};

Fruit aaa;

Fruit bbb(4);

int ccc = aaa + bbb;


10. 请解释下面代码采用了何种 C++
特性( C 语言不具备),作用是什么? (6
分 )

template<typename T>

T sum(T a, T b)

{

return (a + b);

}


11 .请解释 aaa.h
中下面代码的功能 (5 分 )

#if !defined(AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_)

#define AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_

... ...

#endif

答案: 防止重复include头文件。

12 . CMemoryState
主要功能是什么 (5 分 )

检查MFC是否有内存泄露。

// Declare the variables needed
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif

// Do your memory allocations and deallocations.
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );

#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
}
#endif


13 .请阅读下述代码,写出程序执行的结果( 6
分)

#include <iostream>

using namespace std;

class CBase

{

public:

virtual void print()

{

cout<< "base" << endl;

}

void DoPrint()

{

print();

}

};

class CChild1: public CBase

{

public:

virtual void print()

{

cout<< "child1" << endl;

}

};

class CChild2: public CBase

{

public:

virtual void print()

{

cout<< "child2" << endl;

}

};

void DoPrint(CBase *base)
{
base->DoPrint();
}

void main()
{
CBase* base = new CBase();
CChild1* child1 = new CChild1();
CChild2* child2 = new CChild2();
DoPrint(child1);
DoPrint(child2);
DoPrint(base);
delete base;
base = child1;
base->print();
delete child1;
delete child2;
}


答案:

child1

child2

base

child1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: