C++题目(四)

本文列举了一系列C++编程题目,包括数组、进程同步、排序算法、TCP关闭过程、操作系统端口管理等知识点,同时分析了部分题目的解题思路。涉及的编程概念包括迭代器操作、进程同步机制、排序算法效率、TCP连接关闭流程以及编译器、操作系统和数据结构的相关知识。此外,还探讨了动态类型转换和多态在C++中的应用。
摘要由CSDN通过智能技术生成

盛大笔试:
1.求输出结果:

#include "iostream"
#include "vector"
using namespace std;

int main(void)
{
 vector<int>array;
 array.push_back(100);
 array.push_back(300);
 array.push_back(300);
 array.push_back(500);
 vector<int>::iterator itor;
 for(itor=array.begin();itor!=array.end();itor++)
 {
  if(*itor==300)
  {
   itor = array.erase(itor);
  }
 }
 for(itor=array.begin();itor!=array.end();itor++)
 {
  cout<<*itor<<" ";
 }
 return 0;
}


vector在erase之后,指向下一个元素的位置,其实进行erase操作时将后面所有元素都向前移动,迭代器位置没有移动。itor=array.erase(itor)  erase返回下一个元素的地址,相当于给itor一个新值。这里,第一个300被删除后,迭代器指向第二个300,然而随后就有itor++,就指向500了。

2、在win32平台下,以下哪种方式无法实现进程同步?A
A、Critical Section      B、Event      C、Mutex         D、Semaphore

3、按照升序排列的一组数据123456798,下面哪种排序法在空间和时间上最优?C
A、快速排序             B、冒泡排序             C、插入排序             D、堆排序

快排在基本有序的时候效率最低,为O(n2),冒泡一直是O(n2),插入排序在有序的时候最快,这个题目中只要比较9次,交换一次就完成了排序。最差的时候为逆序的时候。堆排序和归并排序相对来说很稳定。

4、TCP的关闭过程,说法正确的是(D)

A、TIME_WAIT状态称为MSL(Maximum Segment Lifetime)等待状态 (2MSL)
B、对一个established状态的TCP连接,在调用shutdown函数之前调用close接口,可以让主动调用的一方进入半关闭状态
C、主动发送FIN消息的连接端,收到对方回应ack之前不能发只能收,在收到对方回复ack之后不能发也不能收,进入CLOSING状态(进入TIME_WAIT)
D、在已经成功建立连接的TCP连接上,如果一端收到RST消息可以让TCP的连洁端绕过半关闭状态并允许丢失数据。

5、操作系统的一些特别端口要为特定的服务做预留,必须要root权限才能打开的端口描述正确的是(C)
A、端口号在64512-65535之间的端口
B、所有小于1024的每个端口
C、RFC标准文档中已经声明特定服务的相关端口,例如http服务的80端口,8080端口等
D、所有端口都可以不受权限限制打开
6、以下描述正确的是
A、虚函数是可以内联的,可以减少函数调用的开销提高效率
B、类里面可以同时存在函数名和参数都一样的虚函数和静态函数
C、父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类对象指针会调用父类的析构函数
D、以上都不对
C为对的,即使父类和子类都没有加上virtual,还是会照常调用父类的析构函数的。
A为正确的,可以参考:http://blog.csdn.net/zy1691/article/details

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 函数是可以[New一个对象的时候要根据函数的函数体来填表;而内联函数没有函数体,只是在预编译阶段展开]内联的,这样就可以减少函数调用的开销,提高效率(错误) 2. 一个类里可以同时存在[同一个类里无论什么函数都不能函数名和参数完全一样]参数和函数名都相同的函数与静态函数(错误) 3. 父类析构函数是非的,但是子类析构函数的,delete子类指针(指向该子类对象)[特殊情况,参见题5],会调用父类析构函数(正确)//任何情况下删除子类都会调用到父类析构函数 4.对于下面的类CA,sizeof(CA) = _B_: A. 4 B. 8 C. 12 D. 16 class CA { public: CA(); virtual ~CA(); //因为有函数,所以会有4个字节的表指针 private: int m_iTime; //成员变量4个字节 public: int GetTime(); int SetTime(int iTime); }; 5.下面这段程序,打印结果是_A_: A. 1 B. 2 C. 3 D. 以上都不对 int g_iCount = 0; class CParent { public: CParent() {} ~CParent() {g_iCount += 1;} }; class CSon : public CParent { public: CSon() {} ~CSon() {g_iCount += 2;} }; main() { CParent* p = new CSon(); delete p[由于p被声明成父类指针,并且父类子类析构函数都非,因此delete操作只能根据p指针声明的类型来调用父类析构函数]; std::cout << g_iCount << std::endl; } 6.请问下面这段程序的输出结果是_A_: A. 2,1, B. 2,2, C. 1,1, D. 1,2, class CParent { public: CParent() {} virtual ~CParent() {} public: virtual void Print() { std::cout << "1,"; }; }; class CSon : public CParent { public: CSon() {}; virtual ~CSon() {}; public: void Print() { std::cout << "2,"; }; }; void Test1(CParent& oParent[这里是引用了一个外部对象,该对象的表不会发生变化]) {oParent.Print();} void Test2(CParent oParent[这里会在栈空间内重新构造一个CParent类的对象,如果传入实参的类型与CParent不同则表会发生变化]) {oParent.Print();} main() { CSon * p = new CSon(); Test1(*p); //这里只是一个引用 Test2(*p); //这里会在栈空间重新构造Cparent类对象 delete p; } 7.请问下面这段程序的输出结果是_D_: A. 2,1, B. 2,2, C. 1,1, D. 1,2, class CParent { public: CParent() {} virtual ~CParent() {} public: void Print(){ std::cout << "1," ; }; }; class CSon : public CParent { public: CSon() {} virtual ~CSon() {} public: void Print(){ std::cout << "2,"; }; }; main() { CSon oSon; CParent * pParent = &oSon; CSon * pSon = &oSon; pParent->Print(); pSon->Print();[由于父类子类的Print函数都非,所以根据指针类型决定调用关系] } 8.请问下面这段程序的输出结果是_C_: A. 2,1, B. 2,2, C. 1,2, D. 1,1, class CParent { public: CParent() {Print();} virtual ~CParent() {} public: virtual void Print(){ std::cout << "1,"; } }; class CSon : public CParent { public: CSon() {Print();} virtual ~CSon() {} public: void Print(){ std::cout << "2,"; } }; main() { CParent * pParent = new CSon()[类的构造过程遵循压栈原则,构造过程中表尚未建立成功,是静态调用函数]; delete pParent; } 9.请问下面这段程序的输出结果是_D_: A. 2,2, B. 2, C. 输出结果不确定 D. 以上都不对 class CParent { public: CParent() {Print();[构造子类对象时调用到父类的构造函数,但父类的Print函数是纯的,没有实现,所以这里的调用不成功,编译会出错]} virtual ~CParent() {} public: virtual void Print() = 0; }; class CSon : public CParent { public: CSon() {Print();} virtual ~CSon() {} public: void Print() { std::cout << "2,"; }; }; main() { CParent * pParent = new CSon(); delete pParent; } 10.请仔细阅读以下程序: class Base { public: virtual bool operator == (int iValue) { std::cout << "I am Base class !" << std::endl; return true; } virtual ~Base(){} }; class Derive: public Base { public: virtual bool operator == (int iValue) { std::cout << "I am Derive class !" << std::endl; return true; } virtual ~Derive(){} }; int main() { Derive derive; Base* pBase = &derive; Derive* pDerive = &derive; *pBase == 0; *pDerive == 0;[重载操作符声明为virtual使操作符产生多态性] return 0; } 程序的输出结果是_B_: A、I am Base class ! I am base class ! B、I am Derive class ! I am Derive class ! C、I am base class ! I am Derive class ! D、I am Derive class ! I am Base class !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值