1、Win32平台下,sizeof(short)=2,sizeof(int)=4,sizeof(long)=4;
注释:这个是32位平台,基本类型的大小,是由编译器决定的。
2、请给出如下程序的结果:
int a = 3;
int b = a << 3;
a=___;b =;
注释:3的二进制:00000011 << 3 后是:00011000。
所以 a=3,b=24;
3、请给出如下程序结果:
#define MAX_NUM 100+200
int Temp = MAX_NUM10;
则:Temp =___;
注释:宏的功能只是简单的字符替换MAX_NUM10表示100+200*10 所以用宏要小心 ,则Temp = 2100;
4、内存是进程范围or线程范围__进程;
注释:进程有独立的内存,是线程的管理者,线程是进程的执行者 。
CPU调度时,针对进程or线程__线程;
注释:线程才是执行者。
函数调用堆栈,针对进程or线程_进程;
注释:进程才有独立内存,堆栈属于内存的一部分
5、栈的插入和删除操作在( A )进行。
A、栈顶 B、栈底 C、任意位置 D、指定位置
注释:栈是规定只能在栈顶插入或删除的线性表,也就是先进先出的规则。
6、对于C++中类(class)与结构体(struct)的描述正确的为(A)。
A 类中的成员默认是private的,可以声明为public,private和protected,结构中定义的成员默认的都是public。
B 结构中不允许定义成员函数,但是类中可以定义成员函数。
C 结构实例使用malloc()动态创建,类对象使用new操作符动态分配内存。
D 结构和类对象都必须使用new创建。
E 结构中不可以定义虚函数,但是类中可以定义虚函数
F 结构不可以存在继承关系,但是类可以存在继承关系
注释:
A正确无异议,B可以定义成员函数,C,D当类中有虚函数时用malloc申请内存出错, E,F结构中也可以有虚函数和继承关系
7、下列关于Windows应用程序对键盘响应的说法,正确的是(D)
A 键盘的扫描码不依赖于具体设备
B Windows应用程序不使用消息来处理键盘响应
C 按下键盘上的一个键,不可能同时产生按键消息和字符消息
D winMain函数的消息循环中的TranslateMessage函数用于把按键消息转换为字符消息
8、简述下列代码有何错误:
void func1()
{
int pa = NULL;
func2(pa); /// 函数返回后pa仍然是空指针
delete pa; /// pa仍然是空指针,pb申请的空间并没有被delete掉
}
void func2(int pb)
{
pb = new int(5); /// pb重新申请了堆空间
}
9、对于频繁使用的一个短小函数,在C中用什么实现?在C++中应用什么实现?
注释:
c用宏定义,c++用inline关键字。
宏定义一般不进行参数类型检查,内联函数会进行类型检查,更加安全。
宏是由预处理器对宏进行替代,而内联函数是通过编译器控制的。
引入内联函数的目的是为了解决程序中函数调用的效率问题。
10、多态类中的虚函数表是Complile-Time,还是Run-Time时建立的?
答:Complile-Time
注释:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员–虚拟函数表指针是在运行期–也就是构造函数被调用时进行初始化的,这是实现多态的关键。
11、请写一个函数重载的简单实例:
int add(int a,int b)
{
return (a + b);
}
函数重载。
float add(float a,float b)
{
return (a + b);
}
答:函数重载是指函数名相同,但参数类型或返回值可能不同的函数。
12、sendMessage和PostMessage有什么区别?
SendMessage:发送消息后,等待消息处理完毕后才继续执行自身的程序。
PostMessage:发送消息后不等待消息处理即继续执行自身的程序。
13、m_pThrd 的类型是 CWinThread 时,WaitForSingleObject(m_pThrd->m_hThread, INFINITE); 有何作用?
答:WaitForSingleObject是表示等待线程的一个函数。
参数为INFINITE表示一直等待线程CWinThread执行结束后,再继续处理自身程序。
14、简述动态链接库(.dll)静态加载和动态加载的不同。
答:
dll的动态加载,又称显式加载,特点有以下几点:
1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存。
2:可以在没有dll时候发现,而不致程序报错。
3:加载程序中有条件才运行的库。
4:热更新,在不停止程序的前提下进行更新。
5:复杂一些,需要显式获得函数地址。
6:dll没有对应的lib文件,此时只能进行动态加载。
7:dll动态加载只需要dll文件就可以了,不需要导入库和头文件。
dll静态加载,又称隐式加载,需要把库中所有的函数链接到可执行文件中。
1:简单方便;
2:没有dll时,系统报错;
3:加载运行很久的库;
4:dll必需有相应的lib文件;
5:将整个dll库加载到exe中,占用内存较大,但速度较快。
6:dll静态加载需要dll和lib文件以及.h文件。
15、请把下述代码加上异常处理。
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;
}
16、请解释“ 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表示一个函数指针,它指向参数为int,int,返回值为int的函数。ttt的值为7
17、请问下述代码中 : int operator+(… )起什么作用? this 是什么? ccc 的值最终为多
少
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)。
18、请解释下面代码采用了何种 C++ 特性,作用是什么? (6 分 )
template
T sum(T a, T b)
{
return (a + b);
}
答:表示函数模板,用于将一类功能相同,参数类型和返回值不同的函数抽象为一个模板,
方便模板函数调用。
19、请解释 aaa.h 中下面代码的功能
#if !defined(AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDE
D_)
#define AFX_MYSUDU_H__9B952BEA_A051_4026_B4E5_0598A39D2DA4__INCLUDED_
… …
#endif
答:这是预处理命令,可以保证多次包含此头文件时,只编译一次代码。
20、CMemoryState 主要功能是什么 ?
注释:用于检测内存泄露。
21、在写程序的过程中常常会出现程序需要占用大量内存,如果系统物理内存中不存在足够多的的内存空间,一般可以考虑使用哪些技术来解决问题?
请大神解答一下。
22、简述几种常用的数字滤波方式。
答:限幅滤波、中值滤波、算术平均滤波、加权平均滤波等
23、一个全局变量tally,两个线程并发执行(代码段都是TfreadProc),问两个线程都结束后,tally取值范围。
int tally = 0;//glable
void ThreadProc()
{
for(int i=1;i<=50;i++)
tally += 1;
}
答:tally(50-100)
注释:最坏的情况: 就是线程一读tally,线程二也读tally,线程一寄存器加一,线程二寄存器加一,线程一放回tally,线程二放回tally,这种情况虽然二个线程都对tally加1,但显然只加了一次。所以到最后只加50次。
最好的情况: 就是线程一的for结束,再到线程二的for,一共执行100次。