原标题:世界五百强IT企业最新C++经典面试题及答案
1. WIN32平台下, sizeof(short) = __2__, sizeof(int) = __4__, sizeof(long) = __4__。 (3分) /// sizeof(char) = 1;sizeof(double) = 8;sizeof(float) = 4;
2.请给出如下程序的结果 (2分 )
int a = 3;
int b = a << 3; /// 00000011左移三位为00011000,即24
a = __3__, b = __24__。
3.请 给出如下程序的结果 (2分 )
int aaa = 0x01;
htonl(aaa) = _16^6___。/// 0x01000000十六进制数,转换为十进制为16的6次方,即16777216
4.请给出如下程序的结果 (2分)
#define MAX_NUM 100+200
int nTemp = MAX_NUM*10; ///宏的功能只是简单的字符替换,MAX_NUM*10表示100+200*10,所以用宏要小心
则 Temp = __2100__。
5.请给出如下程序的结果 (3分 )
char szTemp[1000] = "";
int nLen1 = sizeof(szTemp);
int nLen2 = strlen(szTemp);/// strlen的计算结果不包含结束符'\0'
strcpy(szTemp, "abc");
int nLen3 = sizeof(szTemp);
int nLen4 = strlen(szTemp);
int nTemp[100];
int *pTemp = nTemp;
int nLen5 = sizeof(pTemp);///在32位系统中,指针只占4位字节,不管它指向地址的内容有多大!
char szResult[200] = "";
sprintf(szResult, "%d,%d,%d,%d,d.", 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; /// afxDump表示输出信息到MFC调试(Debug)窗口
if(x = 3) ///注意这里不是"=="而是"=",所以if条件是成立的
{
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;
}
1 .下面代码有何错误
void func1()
{
int *pa = NULL;
func2(pa); ///函数返回后pa仍然是空指针
delete pa; /// pa仍然是空指针,pb申请的空间并没有被delete掉
}
void func2(int *pb)
{
pb = new int(5); /// pb重新申请了堆空间
}
2.下面代码有何错误
void func2(int *value)
{
*value = 2; /// value为空指针,不能被取值,所以*value是错误的
}
void func1()
{
int *p = 0;
func2(p);
}
3.下面代码有何错误
int func1(int& b) ///参数b的类型是整型
{
return 0;
}
void func2()
{
int bbb = 3;
func1(&bbb); ///函数参数的引用调用不需要用符号"&"
func1(bbb);
}
func2中有何错误, func1的参数 b的类型是什么。
1.请简述 C、 C++、 VC、 MFC在概念上的区别 (4分 )
答:C是面向过程编程的语言;
C++是面向对象编程的语言;
VC是微软提供的方便于开发C++程序的一套开发工具。
MFC(Microsoft Function Class),是微软提供的一套函数类库,里面封装了许多Windows API函数,方便开发者调用。
2.请写一个函数重载的简单例子 (4分 )
答:
int add(int a,int b)
{
return (a + b);
}
函数重载:///函数重载是指函数名相同,但参数类型或返回值可能不同的函数。
float add(float a,float b)
{
return (a + b);
}
3.用什么函数开启新进程、线程。 (4分 )
答:CreateProccess()创建进程;
CreateThread()创建线程
MFC中还提供了_beginthread()与_beginthreadex()函数创建线程
4.SendMessage和 PostMessage有什么区别 (4分 )
答:SendMessage:发送消息后,等待消息处理完毕后才继续执行自身的程序。
PostMessage:发送消息后不等待消息处理即继续执行自身的程序。
5.WaitForSingleObject有何作用; m_pThrd的类型是 CWinThread*时, WaitForSingleObject(m_pThrd->m_hThread, INFINITE);有何作用。 (4分 )
WaitForSingleObject
6. __stdcall、 __cdecl、 __pascal在什么方面有所不同。 (4分 )
答:这些都是一些函数参数的调用约定,告诉编译器函数参数压栈的顺序,以及压入堆栈的内容由谁来清除,是调用者还是函数本身清除堆栈的内容。简单列表如下:
Directive Parameter order Clean-up Passes parameters in registers?pascal Left-to-right Routine Nocdecl Right-to-left Caller Nostdcall Right-to-left Routine No
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;
}
答:
int MyWriteFile(CString strFileName, CString strText)
{
int nRet = 0;
CFile myFile;
__try
{
nRet = myFile.Open(strFileName,\
CFile::modeWrite|CFile::shareExclusive|CFile::modeCreate, NULL);
if(!nRet)
{
///输出异常信息
__leave;///结束try块,跳到__finaly代码块
}
int nLen = strText.GetLength();
nRet = myFile.Write((char*)(LPCSTR)strText, nLen);
if(!nRet)
{
///输出异常信息
__leave;///结束try块,跳到__finaly代码块
}
}
__finaly
{
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);
func
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;
答:int operator+(…)表示重载类的“+”号运算符,this表示对象本身的指针,本例中它指向类的对象aaa;ccc最终的结果为8(8 = 2 * 4)。
10.请解释下面代码采用了何种 C++特性( C语言不具备),作用是什么? (6分 )
template
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
答:这是预处理命令,可以保证多次包含此头文件时,只编译一次代码。
12. CMemoryState主要功能是什么 (5分 )
答:用于检测内存泄露。(分配了内存而没有释放,逐渐耗尽内存资源,导致系统崩溃。内存泄露是指程序中间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况,重起计算机可以解决,但是也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件引起的。
)
13.请阅读下述代码,写出程序执行的结果( 6分)
#include
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(这是C++中类的虚函数实现多态的一个实例。返回搜狐,查看更多
责任编辑: