阿里巴巴2016研发工程师笔试题(四)

来源:互联网 发布:js去除数组重复元素 编辑:程序博客网 时间:2024/06/06 21:05

1.以下程序输出结果是____

链接:https://www.nowcoder.com/questionTerminal/94b0fd680ede438ca7fdde4888a39537来源:牛客网class A{  public:    A ():m_iVal(0){test();}    virtual void func() { std::cout<<m_iVal<<‘ ’;}    void test(){func();}  public:      int m_iVal;};class B : public A{  public:    B(){test();}    virtual void func()    {      ++m_iVal;      std::cout<<m_iVal<<‘ ’;      }};int main(int argc ,char* argv[]){  A*p = new B;  p->test();  return 0;}

  • 1 0
  • 0 1
  • 0 1 2(正确)
  • 2 1 0
  • 不可预期
  • 以上都不对


本问题涉及到两个方面:
1.C++继承体系中构造函数的调用顺序。
2.构造函数中调用虚函数问题。

C++继承体系中,初始化时构造函数的调用顺序如下
(1)任何虚拟基类的构造函数按照他们被继承的顺序构造
(2)任何非虚拟基类的构造函数按照他们被继承的顺序构造
(3)任何成员对象的函数按照他们声明的顺序构造
(4)类自己的构造函数
据此可知 A*p = newB;先调用A类的构造函数再调用B类的构造函数。

构造函数中调用虚函数,虚函数表现为该类中虚函数的行为,即在父类构造函数中调用虚函数,虚函数的表现就是父类定义的函数的表现。why?原因如下:
假设构造函数中调用虚函数,表现为普通的虚函数调用行为,即虚函数会表现为相应的子类函数行为,并且假设子类存在一个成员变量int a;子类定义的虚函数的新的行为会操作a变量,在子类初始化时根据构造函数调用顺序会首先调用父类构造函数,那么虚函数回去操作a,而因为a是子类成员变量,这时a尚未初始化,这是一种危险的行为,作为一种明智的选择应该禁止这种行为。所以虚函数会被解释到基类而不是子类。参考链接:点击打开链接

据此可以得到答案C正确


2. 2015年年初,某公司部门举行年会,期间有个游戏,规则是通过猜拳的方法决出每一局的胜负(一人赢其他所有人才算赢得本局,出现平局就继续猜拳),如果谁先赢满7局,则获胜,并赢得全部奖金。现在有3名员工甲、乙、丙参与了这个游戏,游戏进行了一会,分数为甲6,乙5,丙4,但时间已晚,大家要吃饭了。最公平的奖金分配方案是____


3. 以下函数中,和其他函数不属于一类的是_____。

fread
gets
getchar
pread(正确选项)
getline
scanf

4. 如下描述中,错误的是___C_。

A. SATA硬盘因为有机械部件,随机读写时会发生磁头的物理运动。主流硬盘的平均寻道时间在几毫秒到几十毫秒
B. SATA硬盘读写的最小单位是扇区,扇区的大小是512字节或者4k
C. 文件系统读写硬盘的最小单位也是扇区
D. SSD支持随机读写.但是一般读性能要好于写性能
E. SSD的随机读写延时要比SATA低两个数量级
F. SSD根据使用技术的不同,写的寿命是有限的,需要软件进行写优化,确保存储单元的写次数基本同步增长

sata硬盘:SATA(Serial ATA)口的硬盘又叫 串口硬盘 ,全称是Serial Advanced Technology Attachment
ssd硬盘:固态硬盘(Solid State Drives), 适合于个人用户使用。 一般它擦写次数普遍为3000次左右,以常用的64G为例,在SSD的平衡写入机理下,可擦写的总数据量为64G X 3000 = 192000G
文件系统:是抽象与操作系统之上的,   文件系统一般按照     Cluster    大小,有时候也称为     Block    大小来读写数据,这个     Cluster    一般最小的4K,大的定为32K 、64K等都可以,主要根据应用的不同。


5. 有一个类B继承自类A,他们数据成员如下:

链接:https://www.nowcoder.com/questionTerminal/63520f9b91ee488684d710c88c594907来源:牛客网class A {...private:     int a;};class B  : public A {...private:     int a;public:     const int b;     A &c;     static const char* d;     B* e;}

则构造函数中,成员变量一定要通过初始化列表来初始化的是__b,c__。

构造函数初始化时必须采用初始化列表一共有三种情况, 1.需要初始化的数据成员是对象(继承时调用基类构造函数) 2.需要初始化const修饰的类成员 3.需要初始化引用成员数据


6. 以下函数中,和其他函数不属于一类的是_e___。

a.read
b.pread
c.write
d.pwrite
e.fseek
f.lseek

lseek()函数:移动文件的读写位置

read() write()读写文件
pread() pwrite()带偏移量的读写文件
都属于系统调用
fseek()  C语言库函数

阅读全文
0 0
原创粉丝点击