C试题附答案.doc

上传人:s****u 文档编号:12811954 上传时间:2020-05-26 格式:DOC 页数:14 大小:68.50KB
返回 下载 相关 举报
C试题附答案.doc_第1页
第1页 / 共14页
C试题附答案.doc_第2页
第2页 / 共14页
C试题附答案.doc_第3页
第3页 / 共14页
点击查看更多>>
资源描述
C+ 试题一、 选择题:1. 关于类和对象不正确的说法是( C )A) 类是一种类型,它封装了数据和操作B) 对象是类的实例C) 一个类的对象只有一个D) 一个对象必属于某个类2. 在类定义的外部,可以被访问的成员有(C )A) 所有类成员 B) private或protected的类成员C) public的类成员 D) public或private的类成员3.关于this指针的说法错误的是(A )A) this指针必须显示说明 B) 当创建一个对象后,this指针就指向该对象C) 成员函数拥有this指针 D) 静态成员函数不拥有this指针4.声明一个类的对象时,系统自动调用( B )函数,撤消对象时,系统自动调用(C )函数A) 成员函数 B) 构造函数 C) 析构函数 D) 普通函数5. 下面对构造函数的不正确描述是(B )A) 系统可以提供默认的构造函数 B) 构造函数可以有参数,所以可以有返回值C) 构造函数可以重载 D) 构造函数可以设置默认参数6.下面对析构函数的正确描述是(C )A) 系统不能提供默认的析构函数 B) 析构函数必须由用户定义C) 析构函数没有参数 D) 析构函数可以设置默认参数7.对静态成员的不正确描述是(C)A) 静态成员不属于对象,是类的共享成员 B) 静态数据成员要在类外定义和初始化C) 调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针D) 非静态成员函数也可以操作静态数据成员8.下面选项中,不是类的成员函数为(C )A) 构造函数B) 析构函数 C)友元函数 D) 缺省参数的构造函数方言9.下面对友元的错误描述是(D )A) 关键字friend用于声明友元 B) 一个类的成员函数可以是另一个类的友元C) 友元函数访问对象的成员不受访问特性影响 D) 友元函数通过this指针访问对象成员10.在C+中,类与类之间的继承关系具有(C )A) 自反性 B) 对称性 C) 传递性 D) 反对称性11.下列关于类的继承描述中,(A )是错误的A)派生类可以访问基类的所有数据成员,也能调用基类的所有成员函数B)派生类也是基类,但基类不一定具有派生类的全部属性和方法C)继承描述类的层次关系,派生类可以具有与基类相同的属性和方法D)一个基类可以有多个派生类,一个派生类可以有多个基类12.当一个派生类仅有继承一个基类时,基类中的所有公有成员成为派生类的(A )A) public成员 B) private成员 C) protected成员 D) 友元13.当一个派生类私有继承一个基类时,基类中的所有仅有成员和保护成员成为派生类的(B )A) public成员 B) private成员 C) protected成员 D) 友元14.不论派生类以何种方法继承基类,都不能使用基类的(B )A) public成员 B) private成员 C) protected成员 D) public成员和protected成员15.下面描述中,错误的是(BC )(两个答案)A)在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问B)在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问C)在基类定义的public和protected成员在保护继承的派生类中不可见D)在派生类中不可见的成员要变成可访问的,需要进行访问声明16.在C+中,不能被派生类继承的函数是(BC )(两个答案)A) 成员函数 B) 构造函数C) 析构函数 D) 静态成员函数17.在创建派生类对象时,构造函数的执行顺序是(D )A)对象成员构造函数、基类构造函数、派生类本身的构造函数B)派生类本身的构造函数、基类构造函数、对象成员构造函数C)基类构造函数、派生类本身的构造函数、对象成员构造函数D)基类构造函数、对象成员构造函数、派生类本身的构造函数18.当不同的类具有相同的间接基类时,有特点( AD )(两个答案)A)各派生类对象将按继承路线产生自己的基类版本B)派生类对象无法产生自己的基类版本C)为了建立惟一的间接基类版本,在基类定义前加virtual即可D)为了建立惟一的间接基类版本,应该声明虚继承19.在C+中,要实现动态联编,必须使用(D )调用虚函数A) 类名 B) 派生类指针 C) 对象名 D) 基类指针20.下列函数中,可以作为虚函数的是(CD )(两个答案)A) 普通函数 B) 构造函数 C)成员函数 D) 析构函数 21.在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(B )A) 不同 B) 相同 C) 相容 D) 部分相同22.下面函数原型声明中,(B )声明了fun为虚函数A) void fun()=0; B) virtual void fun()=0; C) virtual void fun(); D) virtual void fun();23.若一个类中含有纯虚函数,则该类称为(D )A) 基类 B) 纯基类 C) 派生类 D) 抽象类24.假设A为抽象类,下列声明(B )是正确的A) A fun(int); B) A *p; C) int fun(A); D) A Obj;25.下面描述中,正确的是(BD )(两个答案)A) 虚函数是没有实现的函数 B) 纯虚函数的实现在派生类中C) 抽象类是没有纯虚函数的类 D) 抽象类指针可以指向不同的派生类26.关于函数模板,描述错误的是( A )A)函数模板必须由程序员实例化为可执行的函数模板B)函数模板的实例化由编译器实现C)一个类定义中,只要有一个函数模板,则这个类是类模板D)类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化27.下列的模板说明中,正确提(AD )(两个答案)A)template B)template C)template D)template 28.假设有函数模板定义如下:Template Max(T a, T b, T &c) c=a+b; 下列选项正确的是(AD )(两个答案)A)float x,y; float z; Max(x,y,z);B)int x,y,z; Max(x,y,z);C)int x,y; float z; Max(x,y,z);D)float x; int y, z; Max(x,y,z);29.关于类模板,描述错误的是(D )A)一个普通基类不能派生类模板B)类模板从普通类派生,也可以从类模板派生C)根据建立对象时的实际数据类型,编译器把类模板实例化为模板类D)函数的类模板参数须通过构造函数实例化30.建立类模板对象的实例化过程为(C )A) 基类派生类 B) 构造函数对象C) 模板类对象 D) 模板类模板函数31.在C+中,容器是一种( D )A) 标准类 B) 标准对象 C) 标准函数 D) 标准类模板32.下列类中(BD )(两个答案)不是输入/输出流类iostream的派生类A) fstream B) ofstream C) strstream D)ostrstream33.在下列选项中(BCD )(三个答案)是ostream类的对象A) cin B) cerr C) clog D) cout34.read函数的功能是从输入流中读取(D )A) 一个字符 B) 当前字符C) 一行字符 D) 指定若干个字符35. 下列选项中,用于清除基数格式位置以十六制输出的语句是(B )A) coutsetf(ios:dec, ios:basefield);B) coutsetf(ios:hex, ios:basefield);C) coutsetf(ios:hex, ios:basefield);36. 下列格式控制符,在iostream.h中定义的是(AD )(两个答案),在iomanip.h中定义的是(BC )(两个答案)A) endl B) setfill C) setw D) oct37. 下列串流类,在strstream.h中定义的是(BD )(两个答案),在sstream.h中定义的是(AC )A) istringstream B) istrstreamC) ostringstream D) ostrstream38. 包含类fstream定义的头文件是(A )A) fstream.h B) ofstream.hC) ifstream.h D) iostream.h39. 要求打开文件 d:file.dat,可写入数据,正确的语句是(D )A) ifstream infile(“d:file.dat”, ios:in);B) ifstream infile(“d:file.dat”, ios:in);C) ofstream infile(“d:file.dat”, ios:out);D) fstream infile(“d:file.dat”, ios:in| ios:out);40. 假定已定义浮点型变量data,以二进制方式把data的值写入输出文件流对象outfile中去,正确的语句是(C )A) outfile.write(float *) &data, sizeof(float);B) outfile.write(float *) &data, data);C) outfile.write(char *) &data, sizeof(float);D) outfile.write(char *) &data, data);二、 简答题:1. 什么是预编译,何时需要预编译:回答:总是使用不经常改动的大型代码体。 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。2. C和C+有什么不同?从机制上:c是面向过程的(但c也可以编写面向对象的程序);C+是面向对象的,提供了类。但是,C+编写面向对象的程序比C容易从适用的方向:C适合要求代码体积小的,效率高的场合,如嵌入式;C+适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。从名称上也可以看出,C+比C多了+,说明C+是C的超集;那为什么不叫C+而叫C+呢,是因为C+比C来说扩充的东西太多了,所以就在C后面放上两个+;于是就成了C+C语言是结构化编程语言,C+是面向对象编程语言。C+侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。3. C和C+中的struct有什么不同?回答:C和C+中struct的主要区别是C中的struct不可以含有成员函数,而C+中的struct可以。C+中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private4. 多态的实现机制。 回答:虚函数表和动态联编。 5. 纯虚函数的概念,有什么作用。 回答:基类中要派生类必须只继承其接口且必须由派生类自己提供相应的实现的函数。其作用就是建立一个公共的接口。 6. 简述使用友元函数的优点和缺点。回答:友元函数的优点:不需要修改类的成员函数而可以访问类的私有成员,并且提高了执行效率。 缺点:破坏了类的封装性及信息的隐蔽性。8. 多态。overload 和 override的区别。回答:重载在相同范围(同一个类中),函数名字相同,参数不同,virtual关键字可有可无。覆盖是指派生类函数覆盖基类函数,不同的范围,函数名字相同,参数相同,基类函数必须有virtual关键字。9. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?答:一些变量整个程序中都是可见的,它们称为全局变量,一些变量在函数内部定义且只在函数中可知,则称为局部变量。全局变量由编译器建立且存放在内存的全局数据区,局部变量存放在栈区三、有关内存的思考题 1. void GetMemory(char *p) p = (char *)malloc(100); void Test(void) char *str = NULL; GetMemory(str); strcpy(str, hello world); printf(str);请问运行Test函数会有什么样的结果?回答:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, hello world);将使程序崩溃。2. char *GetMemory(void) char p = hello world; return p;void Test(void) char *str = NULL; str = GetMemory(); printf(str);请问运行Test函数会有什么样的结果?回答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。3. void GetMemory2(char *p, int num) *p = (char *)malloc(num); void Test(void) char *str = NULL; GetMemory(&str, 100); strcpy(str, hello); printf(str);请问运行Test函数会有什么样的结果?回答:(1)能够输出hello(2)内存泄漏3.void Test(void) char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL) strcpy(str, “world”); printf(str); 请问运行Test函数会有什么样的结果?回答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if ( str != NULL )语句不起作用。四 编程题:1.用C+写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数回答:A1:16位的系统下,int i = 65536;cout i; / 输出0;int i = 65535;cout i; / 输出-1;32位的系统下,int i = 65536;cout i; / 输出65536;int i = 65535;cout 65536 ) cout32 bitendl;else cout16 bitendl;2. 已知String类定义如下:class Stringpublic:String(const char *str = NULL); / 通用构造函数String(const String &another); / 拷贝构造函数 String(); / 析构函数String & operater =(const String &rhs); / 赋值函数private:char *m_data; / 用于保存字符串; 尝试写出类的成员函数实现。回答:String:String(const char *str)if ( str = NULL ) /strlen在参数为NULL时会抛异常才会有这步判断m_data = new char1 ;m_data0 = 0 ;elsem_data = new charstrlen(str) + 1;strcpy(m_data,str); String:String(const String &another)m_data = new charstrlen(another.m_data) + 1;strcpy(m_data,other.m_data);String& String:operator =(const String &rhs)if ( this = &rhs )return *this ;delete m_data; /删除原来的数据,新开一块内存m_data = new charstrlen(rhs.m_data) + 1;strcpy(m_data,rhs.m_data);return *this ;String:String()delete m_data ;
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!