文章目录
函数
内联函数
下列哪个类型函数不适合声明为内联函数()。
A.函数体语句较多
B.函数体语句较少
C.函数执行时间较短
D.函数执行时间较长
答案:D
解析:
函数执行时间较长不适合声明为内联函数,其关键字为inline
包含了递归、循环等结构的函数一般不会被内联。
虚函数一般不会内联,但是如果编译器能在编译时确定具体的调用函数,那么仍然会就地展开该函数。
如果通过函数指针调用内联函数,那么该函数将不会内联而是通过call进行调用。
构造和析构函数一般会生成大量代码,因此一般也不适合内联。
如果内联函数调用了其他函数也不会被内联。
内联函数的初衷是为了空间换取时间的更快, 所以不能在内联函数内加上switch和for等语句, 避免代码量增大, 但是是否把当前函数作为内联函数并不是关键字就能决定的, 编译器会左右.
下列关于内联函数的描述中错误的是( )
A、内联函数是在程序编译时被执行的
B、用inline修饰的函数原型其对应的函数也将成为内联函数
C、内联函数不能是递归函数
D、内联函数的主要作用是提高程序的运行效率
答案:B
解析:
是否把当前函数作为内联函数并不是关键字就能决定的, 编译器会左右
函数的返回值
在函数的返回值类型与返回值表达式的类型描述中错误的是( )
A、函数返回值的类型在函数定义时确定,在函数调用时是不能改变的
B、函数返回值的类型就是返回值表达式的类型
C、函数返回值表达式类型与函数返回值类型不同时,表达式类型应转换成函数返回值类型
D、函数返回值类型决定了返回值表达式的类型
答案:B
解析:
函数的返回值类型与返回值类型没有必然的联系,如果返回值类型与返回值类型不同的时候,返回值表达式会发生隐式类型转换变为函数的返回值类型
函数的定义与声明
下列关于C++函数的说法中正确的是( )
A、若函数先定义后调用,则必须在调用前说明
B、如函数先调用后定义,则必须在调用前说明
C、不论函数定义与调用的先后,都必须在调用前说明
D、不论函数定义与调用的先后,都不必在调用前说明
答案:B
解析
函数在先调用在定义时,要进行函数声明
预编译处理
下列关于用#define定义的常量的说法中正确的是( )
A、在函数中定义的常量的作用域从定义起到该函数结束
B、在函数中定义的常量的作用域从定义起到#undef取消为止或文件结束
C、在一个函数中定义的常量不能在同一个文件的后续的其它函数中使用
D、在一个函数中定义的常量不能在同一个文件的后续的其它函数中重新定义
答案:C
解析:
A、#define可以定义常量,但是到#undef才结束
B、#define是到#undef才结束
C、不能只能到本文件中使用
D、可以
类与对象
类的成员数据与函数
下列不能作为类的成员的是()
A、自身类对象的指针
B、自身类对象
C、自身类对象的引用
D、另一个类的对象
答案:B
解析:
类的成员可以是基本的数据类型,用户自定义类型(主要前向引用声明)以及本身类的指针和引用
调用拷贝构造函数的条件
下列情况中,不会调用拷贝构造函数的是( )
A、用一个对象去初始化同一类的另一个新对象时
B、将类的一个对象赋值给该类的另一个对象时
C、函数的形参是类的对象,调用函数进行形参和实参结合时
D、函数的返回值是类的对象,函数执行返回调用时
答案:B
解析
B是调用的已经重载的"="函数
调用拷贝构造函数的情况:
用一个对象去初始化同一类的另一个新对象时
函数的形参是类的对象,调用函数进行形参和实参结合时
函数的返回值是类的对象,函数执行返回调用时
对象的隐式类型转换
具有转换函数功能的构造函数,应该是( )。
A、不带参数的构造函数;
B、带有一个参数的构造函数;
C、带有两个以上参数的构造函数;
D、缺省构造函数。
答案:B
解析:
当含有带有一个参数的构造函数在调用构造函数生成对象时可能会发生隐式类型转换
数据的保护与共享
常成员函数与常变量
对于常成员函数,下面描述正确的是( )
A、类的成员函数可以操作常对象
B、类的成员函数不能操作常对象
C、只有常成员函数可以操作常对象
D、在常成员函数中,常对象可以被更新
答案:C
解析:
只有常成员函数可以操作常对象,正确;且常量不能被更新,
友元
一个类的友元函数或友元类可以访问该类的( )
A、私有成员
B、保护成员
C、公有成员
D、所有成员
答案:D
解析:
一个类的友元函数或友元类可以访问该类的所有成员
静态成员函数
如果在类MyClass的外面使用函数调用MyClass::f();则函数f()是类MyClass的( )
A、静态成员函数
B、非静态成员函数
C、友元函数
D、前面都不正确
答案:A
解析:
只有静态成员函数才能通过类名来调用
继承与派生
基类和派生类的关系
对基类和派生类的关系描述中,错误的是( )
A、派生类是基类的具体化。
B、派生类是基类的子集。
C、派生类是基类定义的延续。
D、派生类是基类的组合。
答案:A
解析:
派生类中包含了基类中的成员,它是对基类定义的扩充和延续,是对基类定义的进一步具体化,而不是基类的子集。
继承机制
继承机制的作用是( )。
A.信息隐藏
B.数据封装
C.定义新类
D.数据抽象
答案:C
解析:
数据封装就是数据抽象,即信息隐藏;而继承是实现程序复用的基础。
继承方式与权限
基类的保护成员在公用派生类中是( )
A、保护成员
B、公用成员
C、私有成员
D、非法成员
答案:A
解析:
类类型兼容原则
在派生类对基类继承的传递性中,错误的是( )
A、在公有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员
B、在公有继承方式下,间接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员
C、在私有继承方式下,直接派生类对象可以直接调用基类中的公有成员函数,去访问基类的私有数据成员
D、不管是私有继承还是公有继承,基类的私有成员在派生类的作用域内都是不可见的
答案:A
解析:
派生类的对象可以赋值给基类对象;
派生类的对象可以初始化基类的引用;
派生类对象的地址可以赋给指向基类的指针。
is-a与has-a和Use-a
关于继承,以下( )项的说法是错误的。
A、派生类不会继承基类的构造函数。
B、"has-a"关系通过继承实现。
C、 继承鼓励重用业已证明的高质量软件。
D、 当销毁派生类对象时,析构函数的调用顺序和相应的构造函数的调用顺序刚好相反。
答案:B
解析:
Is-A继承关系:“表示类与类之间的继承关系、接口与接口之间的继承的关系以及类对接口实现的关系”
Has-A合成关系:“是关联关系的一种,是整体和部分(通常为一个私有的变量)之间的关系,并且代表的整体对象负责构建和销毁代表部分对象,代表部分的对象不能共享”
Use-A依赖关系:“是类与类(通常为函数的参数)之间的连接,依赖总是单向的”
多态性
多态机制
实现C++语言多态机制的是( )
A、类的嵌套
B、类的继承和嵌套
C、继承和虚函数
D、抽象类
答案:C
解析
实现C++语言多态机制的是继承和虚函数虚函数
当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中 ______。
A.都是虚函数
B.只有被重新说明时才是虚函数
C.只有被重新说明为virtual时才是虚函数
D.都不是虚函数
答案:A
解析
当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中都是虚函数,且在派生类中关键字virtual常常被省略
动态联编
动态联编又称为( )
A、多态
B、动态束定
C、动态约束
D、动态约定
答案:B
解析:
动态联编又称为动态束定
静态联编
静态联编又称为( )
A、静多态
B、静态约定
C、静态约束
D、静态束定
答案:D
解析:
静态联编又称为静态束定
模版
模版参数表
关于模板,以下说法错误的是( )
A、同一个模板参数名在模板参数表中可出现多次。
B、类模板不能直接使用,必须先实例化为相应的模板类,然后定义了模板类的对象后才能使用
C、函数模板不能直接使用,需要实例化为模板函数后才能使用
D、类模板的成员函数都是模板函数
答案:A
解析:
(1)如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。
(2)模板参数名不能被当作类模板定义中类成员的名字。
(3)同一个模板参数名在模板参数表中只能出现一次。
(4)在不同的类模板或声明中,模板参数名可以被重复使用。
函数模板
关于函数模板的叙述中,正确的是( )
A、函数模板实际上是函数类型和形参类型不具体指定的通用函数
B、函数模板可以用于描述函数体不同的一系列函数
C、函数模板可以用于描述参数个数不同的一系列函数
D、函数模板定义中typename和class的作用不同
答案:A
解析:
B、函数模板可以用于描述函数体相同的一系列函数
C、函数模板可以用于描述参数个数相同的一系列函数
D、函数模板定义中typename和class的作用相同
关于函数模板的说法中,正确的是( )
A、函数模板中typename和class用于定义不同的虚拟类型名
B、能被函数模板代替的函数必须具有相同个数的形参
C、函数模板的虚拟类型名由C++系统自动确定
D、函数模板的虚拟类型名是在运行阶段确定实际类型的
答案:B
解析:
A、函数模板中typename和class用于定义相同的虚拟类型名
C、函数模板的虚拟类型名由C++系统自动确定
D、函数模板的实例化是由编译程序在处理函数调用时自动完成的