C++笔试题库之编程、问答题 100~150道(一)

2014-11-24 00:54:37 · 作者: · 浏览: 56

101. winsock建立连接的主要实现步骤


答:


服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接, accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。


客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。



102. 进程间主要的通讯方式?


答:信号量,管道,消息,共享内存



103. 构成Win32 API 函数的三个动态链接库是什么?


答:内核库,用户界面管理库,图形设备界面库。



104. 创建一个窗口的步骤是?


答:填充一个窗口类结构->注册这个窗口类->然后再创建窗口->显示窗口->更新窗口。



105. 模态对话框和非模态对话框有什么区别?


答:1.调用规则不同:前者是用DoModal()调用,后者通过属性和ShowWindow()来显示。


2.模态对话框在没有关闭前用户不能进行其他操作,而非模态对话框可以。


3.非模态对话框创建时必须编写自己的共有构造函数,还要调用Create()函数。



106. EDIT框中取出数据给关联的变量,已经把关联的变量的数据显示在EDIT框上的函数是什么?


答: UpdateData(TRUE), Updatedata(FALSE).



107. 简单介绍GDI


答: GDI是Graphics Device Interface 的缩写,译为:图形设备接口;是一个在Windows应用程序中执行与设备无关的函数库,这些函数在不同的输出设备上产生图形以及文字输出。



108. windows消息分为几类?并对各类做简单描述。


答:


1.窗口消息:与窗口相关的消息,除WM_COMMAND之外的所有以WM_开头的消息;


2.命令消息;用于处理用户请求,以WM_COMMAND表示的消息;


3.控件通知消息:统一由WM_NOTIFT表示,


4.用户自定义消息。



109. 如何自定义消息?


答:使用WM_USER 和WM_APP两个宏来自定义消息,



110. 简述Visual C++ Win32 APIMFC之间的关系?


答:(1) Visual C+是一个以C++程序设计语言为基础的、集成的、可视化的编程环境;


(2) Win32 API是32位Windows操作系以C/C++形式提供的一组应用程序接口;


(3) MFC是对Win32 API的封装,简化了开发过程。



111.怎样消除多重继承中的二义性?


答: 1.成员限定符 2.虚基类



112什么叫静态关联,什么叫动态关联


答:在多态中,如果程序在编译阶段就能确定实际执行动作,则称静态关联,


如果等到程序运行才能确定叫动态关联。



113多态的两个必要条件


答:1.一个基类的指针或引用指向一个派生类对象 2.虚函数



114.什么叫智能指针?


答:当一个类中,存在一个指向另一个类对象的指针时,对指针运算符进行重载,那么当前类对象可以通过指针像调用自身成员一样调用另一个类的成员。



115.什么时候需要用虚析构函数?


答:当基类指针指向用new运算符生成的派生类对象时,delete基类指针时,派生类部分没有释放掉而造成释放不彻底现象,需要虚析构函数。 补充:虚函数就是让派生类调用基类的虚函数。



116. MFC中,大部分类是从哪个类继承而来


答:CObject



117.什么是平衡二叉树?


答:左右子树都是平衡二叉树,而且左右子树的深度差值的约对值不大于1。



118.语句for( 1 )有什么问题?它是什么意思?


答:无限循环,和while(1)相同。



119.派生新类的过程要经历三个步骤


答:1.吸收基类成员 2.改造基类成员 3.添加新成员



121. TCP/IP 建立连接的过程


答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。


第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;


第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;


第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手



122. memset ,memcpy 的区别


答:memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为’\0′。


memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;



123. C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”


答:C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字


与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo , 而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。



124怎样定义一个纯虚函数?含有纯虚函数的类称为什么?


答:在虚函数的后面加=0,含有虚函数的类称为抽象类。



125.已知strcpy函数的原型是:


char * strcpy(char * strDest,const char * strSrc);不调用库函数,实现strcpy函数。其中,strSrc是原字符串,strDest是目标字符串


答案:


char *strcpy(char *strDest, const char *strSrc)


{


if ( strDest == NULL || strSrc == NULL)


return NULL ;


if ( strDest == strSrc)


return strDest ;


char *tempptr = strDest ; //指针tempptr指向strDest的地址;


while( (*strDest++ = *strSrc++) != ‘\\0’) //注意:别忘了转义符;


;


return tempptr ; //返回指针向的地址;


}



126.已知类String 的原型为:


class String


{


public:


String(const char *str = NULL); // 普通构造函数


String(const String &other); // 拷贝构造函数


~ String(void); // 析构函数


String & operate =(const String &other); // 赋值函数


private:


char *m_data; // 用于保存字符串


};


请编写String 的上述4 个函数。


答案:


// 普通构造函数


String::String(const char *str)


{


if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断


{


m_data = new char[1] ;


m_data[0] = ” ;


}


else


{


m_data = new char[strlen(str) + 1];


strcpy(m_data,str);


}


}


//拷贝构造函数


Strin