===《C/C++笔记》===面向对象

8 篇文章 0 订阅

1.面向对象的基本概念:对象、类、继承。

2.C++的空类默认产生哪些成员函数:对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数

3.structure是否可以拥有constructor和destructor及成员函数,如果可以,与class有什么区别:

class中变量默认是private,struct中的变量默认是public。struct可以有构造函数、析构函数、可以继承等等。c++中的struct其实和class意义一样。唯一的不同就是struct里面默认的访问控制是public,class中默认的访问控制是private。C++中存在struct关键字的唯一意义是为了让C++编译器兼容以前用C开发的项目。

4.哪一种成员变量可以在同一个类的实例之间共享:

必须使用静态成员变量在一个类的所有实例之间共享数据。如果想限制对静态成员变量的访问,则必须把它们声明为保护型或私有型。不允许用静态成员变量存放某一个对象的数据。静态成员数据是在这个类的所有对象间共享的。

5.关于类的成员变量:常量必须在类的构造函数的初始化列表里面初始化或者将其设置为static;初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的。

6.将CObjecet的析构函数设为virtual型,则所有CObject类的派生类的析构函数都将自动变为virtual型,这保证了在任何情况下,不会出现由于析构函数未被调用而导致的内存泄露,这才是MFC将CObject::~CObject()设为virtual型的真正原因。

7.析构函数可以为virtual,为什么构造函数不能为虚呢:虚函数采用一种虚调用的方法。虚调用是一种可以在只有部分信息的情况下调用的机制,特别允许我们调用一个只知道接口而不知道其准确数据类型的函数。但是,如果创建一个对象,势必要知道对象的准确数据类型,因此构造函数不能为虚。

8.如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数:虚函数是有代价的,由于每个虚函数的对象都必须维护一个v表,因此在使用虚函数的时候都会产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,则根本没必要使用虚函数。

9.析构函数可以是内联函数。

10.覆盖和重载:覆盖(override)是指派生类重写基类的虚函数,重写的函数必须由一致的参数表和返回值;重载(overload)是指函数同名但参数表不同的函数,重载只是一种语法规则,与多态没有直接关系。

11.虚函数的入口地址和普通函数的不同:

每个虚函数都在vtable中占了一个表项,保存着一条跳转到它的入口地址的指令(实际上就是保存了它的入口地址),当一个包含虚函数的对象被创建时,它在头部附加一个指针,指向vtable中相应的位置,调用虚函数的时候,不管你是用什么指针调用的,它先根据vtable找到入口地址再执行,从而实现动态联编,而不像普通函数那样简单的跳转到一个固定地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值