您的位置:首页 > 其它

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

2017-07-04 10:43 435 查看
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语言库函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐