C++笔试题Word格式.docx

上传人:b****6 文档编号:20250819 上传时间:2023-01-21 格式:DOCX 页数:13 大小:19.98KB
下载 相关 举报
C++笔试题Word格式.docx_第1页
第1页 / 共13页
C++笔试题Word格式.docx_第2页
第2页 / 共13页
C++笔试题Word格式.docx_第3页
第3页 / 共13页
C++笔试题Word格式.docx_第4页
第4页 / 共13页
C++笔试题Word格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C++笔试题Word格式.docx

《C++笔试题Word格式.docx》由会员分享,可在线阅读,更多相关《C++笔试题Word格式.docx(13页珍藏版)》请在冰豆网上搜索。

C++笔试题Word格式.docx

CSubobj;

A.constructingCSubclassB.constructingCBaseclass

constructingCBaseclassconstructingCSubclass

destructingCSubclassdestructingCBaseclass

destructingCBaseclassdestructingCSubclass

C.constructingCBaseclass

constructingCSubclass

destructingCSubclass

destructingCBaseclass

D.constructingCSubclass

constructingCBaseclass

destructingCBaseclass

destructingCSubclass

4.在一个cpp文件里面,定义了一个static类型的全局变量,下面一个正确的描述是:

A.只能在该cpp所在的编译模块中使用该变量

B.该变量的值是不可改变的

C.该变量不能在类的成员函数中引用

D.这种变量只能是基本类型(如int,char)不能是C++类型

5.观察下面一段代码:

classClassA

virtual~ClassA(){};

virtualvoidFunctionA(){};

classClassB

virtualvoidFunctionB(){};

classClassC:

publicClassA,publicClassB

ClassCaObject;

ClassA*pA=&

aObject;

ClassB*pB=&

ClassC*pC=&

关于pA,pB,pC的取值,下面的描述中正确的是:

A.pA,pB,pC的取值相同.B.pC=pA+pB

C.pA和pB不相同D.pC不等于pA也不等于pB

6.参照1.5的代码,假设定义了ClassA*pA2,下面正确的代码是:

A.pA2=static_cast<

ClassA*>

(pB);

B.void*pVoid=static_cast<

void*>

pA2=static_cast<

(pVoid);

C.pA2=pB;

D.pA2=static_cast<

(static_cast<

ClassC*>

(pB));

7.参照1.5的代码,下面那一个语句是不安全的:

A.deletepAB.deletepBC.deletepC

8.下列程序的运行结果为:

inta=2;

intb=++a;

cout<

a/6<

A.0.5B.0C0.7D.0.6666666-

9.有如下一段代码:

#defineADD(x,y)x+y

intm=3;

m+=m*ADD(m,m);

则m的值为:

A.15B.12C.18D.58

10.如下是一个带权的图,图中结点A到结点D的关键路径的长度是:

A.13B.15C.28D.58

11.下面的模板声明中,正确的是:

A.template<

typenameT1,T2>

B.template<

classT1,T2>

C.template<

classT1,classT2>

D.template<

typenameT1;

typenameT2>

12.在Windows编程中下面的说法正确的是:

A.两个窗口,他们的窗口句柄可以是相同的B.两个窗口,他们的处理函数可以是相同的

C.两个窗口,他们的窗口句柄和窗口处理函数都不可以相同.

13.下面哪种情况下,B不能隐式转换为A?

A.classB:

publicA{}B.classA:

publicB{}

C.classB{operatorA();

}D.classA{A(constB&

);

14.某公司使用包过滤防火墙控制进出公司局域网的数据,在不考虑使用代理服务器的情况下,下面描述错误的是”该防火墙能够()”.

A.使公司员工只能访问Internet上与其业务联系的公司的IP地址.

B.仅允许HTTP协议通过,不允许其他协议通过,例如TCP/UDP.

C.使员工不能直接访问FTP服务器端口号为21的FTP地址.

D.仅允许公司中具有某些特定IP地址的计算机可以访问外部网络

15.数字字符0的ASCII值为48,若有以下程序:

main()

chara=’1’,b=’2’;

printf(“%c,”,b++);

printf(“%d\n”,b-a);

程序运行之后的输出结果是:

A.3,2B.50,2C.2,2D.2,50

二.填空题(共40分)

本程序从正文文件text.in读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到正文文件word.out中.

程序用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立.然后中序遍历该二叉树,将遍历经过的二叉树上的节点的内容输出.

程序中的外部函数

intgetword(FILE*pFile,char*pszWordBuffer,intnBufferLen);

从与pFile所对应的文件中读取单词置入pszWordBuffer,并返回1;

若单词遇文件尾,已无单词可读时,则返回0.

#include<

stdio.h>

malloc.h>

ctype.h>

string.h>

#defineSOURCE_FILE"

text.in"

#defineOUTPUT_FILE"

word.out"

#defineMAX_WORD_LEN128

typedefstructtreenode

charszWord[MAX_WORD_LEN];

intnCount;

structtreenode*pLeft;

structtreenode*pRight;

}BNODE;

intgetword(FILE*pFile,char*pasWordBuffer,intnBufferLen);

voidbinary_tree(BNODE**ppNode,char*pszWord)

if(ppNode!

=NULL&

&

pszWord!

=NULL)

{

BNODE*pCurrentNode=NULL;

BNODE*pMemoNode=NULL;

intnStrCmpRes=0;

____

(1)_____;

pCurrentNode=*ppNode

while(pCurrentNode)

/*寻找插入位置*/

nStrCmpRes=strcmp(pszWord,___

(2)___);

pCurrentNode->

nCount

if(!

nStrCmpRes)

___(3)___;

pCurrentNode->

nCount++

return;

}

else

___(4)___;

pMemoNode=pCurrentNode

pCurrentNode=nStrCmpRes>

0?

pRight:

pLeft;

pCurrent=newBNODE;

if(pCurrentNode!

memset(pCurrentNode,0,sizeof(BNODE));

strncpy(pCurrentNode->

szWord,pszWord,MAX_WORD_LEN-1);

nCount=1;

if(pMemoNode==NULL)

___(5)___;

*ppNode=pCurrentNode

elseif(nStrCmpRes>

0)

pMemoNode->

pRight=pCurrentNode;

pLeft=pCurrentNode;

voidmidorder(FILE*pFile,BNODE*pNode)

if(___(6)___)return;

!

pNode||!

pFile

midorder(pFile,pNode->

pLeft);

fprintf(pFile,"

%s%d\n"

pNode->

szWord,pNode->

nCount);

pRight);

FILE*pFile=NULL;

BNODE*pRootNode=NULL;

charszWord[MAX_WORD_LEN]={0};

pFile=fopen(SOURCE_FILE,"

r"

if(pFile==NULL)

printf("

Can'

topenfile%s\n"

SOURCE_FILE);

while(getword(pFile,szWord,MAX_WORD_LEN)==1)

binary_tree(___(7)___);

//pRootNode,szWord

fclose(pFile);

pFile=fopen(OUTPUT_FILE,"

w"

midorder(pFile,pRootNode);

三.附加题(每题30分,2题,共60分)

1.从程序健壮性进行分析,下面的FillUserInfo函数和Main函数分别存在什么问题?

iostream>

string>

#defineMAX_NAME_LEN20

structUSERINFO

intnAge;

charszName[MAX_NAME_LEN];

voidFillUserInfo(USERINFO*parUserInfo)

stu:

:

"

请输入用户的个数:

;

intnCount=0;

std:

cin>

>

nCount;

for(inti=0;

i<

i++)

请输入年龄:

parUserInfo[i]->

nAge;

stringstrName;

请输入姓名:

strName;

strcpy(parUserInfo[i].szName,strName.c_str());

intmain(intargc,char*argv[])

USERINFOarUserInfos[100]={0};

FillUserInfo(arUserInfos);

Thefirstnameis:

printf(arUserInfos[0].szName);

\n"

return0;

2.假设你在编写一个使用多线程技术的程序,当程序中止运行时,需要怎样一个机制来安全有效的中止所有的线程?

请描述其具体流程.

本文来自CSDN博客,转载请标明出处:

structCLS

intm_i;

CLS(inti):

m_i(i){}

CLS()

CLS(0);

voidmain(void)

CLSobj1;

//调用无参数构造函数,再调用CLS(0)?

CLSobj2

(1);

cout<

obj1.m_i<

endl;

//-858993460

obj2.m_i<

//1

CLS(0)去掉或者改为CLS

(2),结果都是一样的,证明上述结果只是一个随机数而已。

为什么调用了CLS(0)没有任何作用呢?

?

需要清楚的是对象的创建是分两步来完成的

1、首先是先分配内存,如果是动态分配的话,需要调用operatornew操作符,如果是作为一个局部变量由编译器在栈上分配内存

2、分配完内存以后,编译器或者new自动调用构造函数进行初始化

这两步是有先后顺序的,必须第一步完成以后才会做第二步的,假如在动态分配的时候内存分配失败,那编译器能够保证第二步不会执行。

显然上面代码中,CLSobj1;

这里已经为obj1分配了内存,然后调用默认构造函数,但是默认构造函数还未执行完,却调用了另一个构造函数,这样相当于产生了一个匿名的临时CLS对象,它调用CLS(int)构造函数,将这个匿名临时对象自己的数据成员m_i初始化为0;

但是obj的数据成员并没有得到初始化。

于是obj的m_i是未初始化的,因此其值也是不确定的。

会产生一个新的临时对象,可以观察一个在两个构造函数里面的this指针就知道了,构造函数执行完毕时随即析构该临时对象。

要想达到期望的效果,在构造函数里调用另一个构造函数的关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placementnew做到

inlinevoid*__cdecloperatornew(size_t,void*_P)

}

调用上述的函数没有分配新的内存,这正是我们想要的。

因此我们可以这样在一个构造函数里调用另一个构造函数:

classCTest

public:

inta;

intb;

CTest(inta,intb)

this->

a=a;

b=b;

CTest(inta)

new(this)CTest(a,5);

intmain(intargc,char*argv[])

{

CTestobj

(1);

cout<

"

ais"

<

obj.a<

bis"

obj.b<

在C++中,成员函数的调用约定是thiscall,这个约定的意思是调用的时候第一个参数是个this指针。

但是构造函数不会自动接收this指针,因为这个时候对象还没有成功建立呢。

其实,构造函数和其他的成员函数也没多大的区别,最主要的区别是他一般是由编译器生成代码自动实现调用的,因此他不需要返回值(也没必要)。

但也能像调用普通成员函数一样调用构造函数,这个时候需要明确使用this来引用构造函数,如this->

CTest:

CTest()

//new(this)CTest(a,5);

CTest(a,5);

这种情况下,第二个有参构造函数就是在第一个构造函数的基础上进行初始化。

若构造函数调用自身,则会出现无限递归调用,将会发生堆栈溢出。

First-chanceexceptioninThinkingInCPlusPlus.exe:

0xC00000FD:

StackOverflow.

从这里,我们归纳如下:

1)在c++里,由于构造函数允许有默认参数,使得这种构造函数调用构造函数来重用代码的需求大为减少。

因此应尽量避免这样使用,适用不当会带来意想不到的问题

2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可

3)偶尔我们还是希望在类的构造函数里调用另一个构造函数,关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placementnew或者明确通过第一个对象的this指针来调用第二个构造函数,此时相当于普通的函数调用。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1