刷刷笔试题~(1)

来源:互联网 发布:人工智能工厂生产案例 编辑:程序博客网 时间:2024/04/30 14:32

1.print()函数是一个类的常成员函数,它无返回值,下列表示中正确的是()

void print() const;
知识点:
常成员函数的说明格式如下:
类型说明符 函数名(参数表)const;
2.下列对于宏的描述,不正确的是:(A)
  • 宏会带来性能的缺失
  • 宏不进行类型检查
  • 宏可以做到函数无法做到的功能
  • 编译时宏的处理早于函数
知识点:宏只是预定义的函数,在编译阶段不进行类型安全性检查,在编译的时候将对应函数用宏命令替换。对程序性能无影响。

3.const char*, char const*, char*const的区别问题
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。
事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。 
const
char * const cp; ( *
读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
4.查看下面两段代码
(1)class classA {...};class classB{public:    classB(classA a) {mA = a;}private:    classA mA;};(2)class classA {...};class classB{public:    classB(classA a): mA(a) {}private:    classA mA;};
A.两种方法产生的结果和效率完全相同
B.通常情况下(2)的效率更高
C.通常情况下(1)的效率更高
D.两种调用方法会产生不同的结果
解析:第一种先调用 a的默认构造函数,再调用operator=赋值函数
第二种直接调用复制构造函数(拷贝构造函数)
关于拷贝构造函数: C++拷贝构造函数详解
5.C++中32位单精度浮点数能表示的十进制有效数字是多少位?(7位)
解析:
  1. 一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M。

  2. 单精度浮点数(float)总共用32位来表示浮点数,其中尾数用23位存储,加上小数点前有一位隐藏的1(IEEE754规约数表示法),2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。

  3. 考虑到第7位可能的四舍五入问题,所以单精度最少有6位有效数字(最小尺寸)。 
3.同样地:双精度浮点数(double)总共用64位来表示浮点数,其中尾数用52位存储,     2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。同样四舍五入,最少15位。
6.使用下列二位图形变换矩阵将产生的变换结果为
 
以Y轴为对称轴的反射图形
解析:
7.对于protected成员,下面说法错误的是:(A)
A.基类可以访问从所有派生类造型(cast)成基类对象的protected成员
B.从派生类继承的子类里可以访问基类的protected成员
C.派生类可以定义一个同名的非protected成员
D.派生类可以访问基类对象的protected成员
解析:
《C++ Primer》中关于protected 成员的描述是这样的:
protected Members
The protected access label can be thought of as a blend of private and public :
Like private members, protected members are inaccessible to users of the class.
Like public members, the protected members are accessible to classes derived from this class.
In addition, protected has another important property:
A derived object may access the protected members of its base class only through a derived
object. The derived class has no special access to the protected members of base type objects.
在没有继承的情况下,protected跟private相同。在派生类的时候才出现分化。
基类对象不能访问基类的protected成员,派生类中可以访问基类的protected成员。
也就是说private成员是不能被继承的,只有public,protected的成员才可以被继承。
派生类对象如果要访问基类protected成员只有通过派生类对象,派生类不能访问基类对象的protected成员。
请注意 drived class和drived object:派生类和派生类对象。第一点和第二点都是针对派生类来说的。
对于第三点总结一句话:只有在派生类中才可以通过派生类对象访问基类的protected成员。

8.当一个类对象的生命周期结束后,关于调用析构函数的描述正确的是:(C)
A.如果派生类没有定义析构函数,则只调用基类的析构函数
B.如果基类没有定义析构函数,则只调用派生类的析构函数
C.先调用派生类的析构函数,后调用基类的析构函数
D.先调用基类的析构函数,后调用派生类的析构函数

解析:
没有定义析构函数会有默认析构函数
析构过程与构造过程相反,构造过程先调用基类构造函数,再调用派生类构造函数。
析构就反过来,先调用派生类析构函数,再调用基类析构函数

9.以下哪种STL容器中的对象是连续存储的:(B)
A.list
B.vector
C.map
D.set

解析:
STL常用容器浅谈
·····顺序性容器
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。
deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。
deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。
 list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。
但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

·····关联容器

map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。

set也是一种关联性容器,它同map一样,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝,所以效率比较高。

·····容器适配器

queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。

stack是实现先进后出的功能,和queue一样,也是内部封装了deque,这也是为啥称为容器适配器的原因吧(纯属猜测)

10.一个栈的入栈序列是A、B、C、D、E,则栈的不可能输出序列是:(A)

a. DCEAB
b. ABCDE
c. EDCBA
d. DECBA

解析:
堆栈讲究先进后出,后进先出
选项2是abcd先依次入栈,然后d出栈,e再入栈,e出栈
a入栈,然后a出栈;b再入栈,b出栈。。。。。。依此类推
选项3是abcde入栈,然后依次出栈
选项4是abcd先依次入栈,d出栈,e入栈,再依次出栈
11.下列情况中,不会调用拷贝构造函数的是(B)

A.用一个对象去初始化同一个类的另一个新对象时
B.将类的一个对象赋值给该类的另一个对象时
C.函数的形参对象,调用函数进行形参和实参结合时
D.函数的返回值是类的对象,函数执行返回调用时

解析:
拷贝构造函数是在创建对象时调用,赋值函数是在已经对象进行赋值时调用。
将类的对象赋值给同类的另一个对象时,是将两对象指向相同的段地址;
拷贝构造函数是创建对象的副本,新对象的修改不改变原对象。

12.假设下面的函数foo会被多线程调用,那么让i、j、k三个变量哪些因为线程间共享访问需要加锁保护.(i,j)
int i = 0;void foo(){    static int j = 0;    int k = 0;    i++; j++; k++;}

解析:
多线程调用时要进行保护时,主要是针对全局变量和静态变量的,函数内的局部变量不会受到影响。
这里i是全局变量,j是局部静态变量,所以 要进行保护。

13.下面哪个不是线性表?(D)
A.循环链表
B.队列
C.栈
D.关联数组
E空字符串数组
F.双向链表

解析:
“关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。

14.如下C程序,在64位处理器上运行后sz的值是什么?(16)
struct st{    int *p;    int i;    char a;};int sz=sizeof(struct st);

考点:
1.struct的对齐原则,注意不同的编译器有不同的效果。
2.不同的数据类型在32位和64位下所占字节的区别
32位编译器:
      char :1个字节
      char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
      short int : 2个字节
      int: 4个字节
      unsigned int : 4个字节
      float: 4个字节
      double: 8个字节
      long: 4个字节
      long long: 8个字节
      unsigned long: 4个字节
  64位编译器:
      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
      int: 4个字节
      unsigned int : 4个字节
      float: 4个字节
      double: 8个字节
      long: 8个字节
      long long: 8个字节
      unsigned long: 8个字节
 此处指针先占用8字节。int占用4字节,满足要求不用补齐,char占用一个字节,同时总的字节数必须满足8的倍数即16

15.下面关于一个类的静态成员描述中,不正确的是(C)
A.静态成员变量可被该类的所有方法访问
B.该类的静态方法只能访问该类的静态成员函数
C.该类的静态数据成员变量的值不可修改
D.子类可以访问父类的静态成员
E.静态成员无多态特性

解析:
类的静态成员属于整个类 而不是某个对象,可以被类的所有方法访问,子类当然可以访问父类静态成员;
静态方法属于整个类,在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存,
所有静态方法只能访问静态成员,不能访问非静态成员;
静态成员可以被任一对象修改,修改后的值可以被所有对象共享。

16.以下函数中,和其他函数不属于一类的是(D)

A.fread
B.gets
C.getchar
D.pread
E.getline
F.scanf

解析:
pread是系统调用,其他事IO函数
[这个题之后要好好再看看]







0 0