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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值