C/C++--two

面向对象

面向对象设计的三原则:封装、继承、多态。

(1)析构函数可以设置为virtual,为什么?
  主要是因为多态的存在,例如一个父类指针指向一个子类对象,试想一下如果子类构造函数如果在堆中分配了内存,而析构其析构函数又不是virtual的,这个指针的静态类型是父类类型,那么撤销这个父类指针时,将只会调用父类的析构函数,而不会释放子类占据的内存,造成内存泄漏。
将父类的析构函数设置为virtual型,则所以这个父类的派生类的析构函数都将自动变为virtual型。

(2)构造函数可以为virtual吗?为什么?
  虚函数的实现是依赖于虚函数表的,而虚函数表是在构造函数中进行初始化,在构造对象期间虚函数表还没有被初始化,将无法进行。

(3)什么是多态?
  多态性其实就是“一个接口,多种方法”,在程序运行的过程中才决定调用的函数。多态性是允许你将父对象设置成为和它的子对象相等的技术,赋值后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。是通过虚函数实现的。
  虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,叫做覆盖或者重写。
那么多态的作用是什么?
  我们知道,封装可以隐藏实现细节,使得代码模块话;继承可以扩展已存在的代码模块;他们的目的都是为了代码重用。而多态则是为了实现另一个目的—–接口重用。

(4)重载和覆盖有什么不同?
  重载:在相同范围内,函数名相同,函数参数列表不同(个数或类型),返回值可相同可不同。
  覆盖:不在同一范围(基类与派生类),函数名相同,参数相同,基类必须有virtual关键字。

(5)构造函数中能否抛出异常呢?析构函数中呢?
  构造函数中遇到异常是不会调用析构函数的,一个对象的构造函数未执行完毕,不能称之为构造完成,构造要么完全成功,要么完全失败。试想它都没有构造成功,还不能算一个真正的对象,怎么调用析构呢?对于成员变量,C++遵循这么一个规律,会从异常的发生点按照成员变量的初始化的逆序释放成员,也就是会调用已经初始化过的成员变量各自的析构函数。也就是说当我们用原始指针申请了一段空间,就会造成内存泄露,因为它们没有自己的析构函数,必须程序员手动释放。那怎么办呢?这时auto_ptr的作用就凸显出来了,当使用的是auto_ptr进行动态内存管理时,系统就可以调用它的析构函数进行析构,就不会造成内存泄漏。
  对于析构函数来说,尽量不要在析构函数中抛出异常,因为析构函数用来释放资源,试想当对象出现异常,有责任释放这个对象的资源,调用对象的析构函数,可现在析构再出现异常,那么就没法保证这个对象的资源释放完全了,而且这新出现的异常又由谁来处理呢?当然如果非得在析构函数中抛出异常,那就必须在析构函数中捕捉它。
  因此析构函数中尽可能不要抛出异常。如果非抛不可,那么就自己的异常,自己处理。

(6)讲讲三种集成继承。
  继承是实现代码重用的最重要的手段,继承可以扩展已存在的代码模块。
  继承体系中的作用域:

  • 在继承体系中基类和派生类是两个不同作用域。
  • 子类和父类中有同名成员,子类成员将屏蔽父类对成员 的直接访问。(在子类成员函数中,可以使用基类: : 基类成员)访问–隐藏–重定义
  • 注意在实际中在继承体系里面最好不要定义同名 的成员
    继承关系

(7)什么是虚继承?他与一般继承有什么不同?它有什么用?
  虚拟集成是多重继承中特有的概念。虚拟继承是为了解决菱形继承的二义性和数据冗余的问题。

位运算与嵌入式编程

(1)关键字volatile有什么含义?并给出三个不同的例子。
  变量定义为volatile是说这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。简单来说就是优化器在用到这个变量时必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是几个例子:

  • 并行设备的硬件寄存器
  • 一个中断服务子程序会访问到的非自动变量
  • 多线程应用中被几个任务共享的变量

(2)了解Little-endian和Big-endian?
  小端模式:CPU对操作数的存放方式是从低字节到高字节。
  大端模式:存放方式是从高字节到低字节。

(3)关键字static的作用是什么?

  • 函数体内static变量的作用范围为该函数体,不同与auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
  • 在模块内的static全局变量可以被模块内的所有函数访问,但不能被模块外其他函数访问。
  • 在模块内的static函数,只能被模块内的其他函数调用。
  • 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝。
  • 在类中的static成员函数数据整个类所拥有,这个函数不接受this指针,因而只能访问类的static成员变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值