10.9

1.extern关键字作用

extern置于变量或者函数之前,标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块寻找其定义。还可以用于链接指定。

如:extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名是按照C的规则去翻译相应的函数名。

2.static关键字作用

在C中

修饰局部变量:使得被修饰的变量成为静态变量,存储在静态区,生命周期和程序相同,在main函数之前初始化,在程序退出时销毁。局部静态变量,退出函数后该变量不会被销毁,再次调用函数时,变量值与上次退出函数时值相同。变量的访问还要受到作用域的限制。

如果实在函数里定义的,那么在编译期其值就已经被确定,在main函数之前就完成了初始化,所以局部静态变量只会初始化一次。

修饰全局变量:

全局变量本身就在静态区,因此static并不能改变其存储位置。但是static限制了其链接属性。被static修饰的全局变量只能被包含该定义的文件访问。

https://blog.csdn.net/shanghairuoxiao/article/details/72904292

修饰函数:

对于静态函数,声明和定义需要放在同一个文件夹里。如果将static函数定义在头文件里,则每一个包含该头文件的文件都实现了该函数。因此static实现了不同文件中定义同名的函数,而不发生冲突。

在C++中:具备C中所有作用,对于静态成员变量和静态成员函数,所有的对象都只维持同一个实例。

3.volatile的作用

a.访问寄存器比访问内存要快,因此CPU会优先访问该数据在寄存器中的存储结果,但是内存中的数据可能已经发生改变,而寄存器中还保留着原来的结果。为了避免这种情况的发生将变量声明为volatile,告诉CPU每次都从内存中读取数据。

b.一个参数可以即是const又是volatile,比如只读状态寄存器,是volatile是因为他可能被意想不到的被改变,是const是告诉程序不应该试图修改它。

4.const的作用

a.const修饰全局变量;

b.const修饰局部变量;

c.const修饰指针;

d.const修饰指针指向的对象,int* const;

e.const修饰引用做形参;

f.const修饰成员变量,必须在构造函数列表中初始化;

g.const修饰成员函数,说明该函数不应该修改非静态成员,但是这并不是十分可靠的,指针所指的非成员对象值可能会被改变

4.new和malloc区别

a.new分配内存按照数据类型进行分配,malloc分配内存按照大小分配;

b.new会调用构造函数,malloc不会。int* p = new int与int* p = new int()的区别。int属于c++内置对象,不会默认初始化,必须显式调用默认构造函数,但是对于自定义对象都会默认调用构造函数初始化,在C++11中两者没有区别;

c.new返回的是指定对象的指针,malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化;

d.new是一个操作符可以重载,malloc是一个库函数;

e.new分配的内存要用delete销毁,malloc要用free销毁;delete销毁的时候会调用对象的析构函数,而free不会;

f.malloc分配的内存不够的时候,可以用realloc扩容,new没有这样的操作;

g.new如果分配失败了会抛出bad_malloc的一场,而malloc失败了会返回NULL。因此对于new,正确的姿势是采用try...catch的语法,而malloc则应该判断指针的返回值。c++也可以采用new nothrow的方法禁止抛出异常而返回NULL;

h.new和new[]的区别,new[]一次分配所有内存,多次调用构造函数,分配搭配使用delete和delete[],同理,delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int)*n;

i.其余还有new和malloc的实现,空闲链表,分配方法(首次适配原则,最佳适配原则,最差适配原则,快速适配原则)。delete和free的实现原理,free如何知道销毁多大的空间

5.C++多态性和虚函数表

a.C++多态的实现

多态分为静态多态和动态多态。静态多态是通过重载和模板技术实现,在编译的时候确定。动态多态通过虚函数和继承关系来实现,执行动态绑定,在运行的时候确定。

动态多态的实现条件:虚函数;一个基类的指针或者引用指向派生类的对象;

基类指针在调用成员函数时,就会去查找该对象的虚函数表。虚函数表的地址在每个对象的首地址。查找该虚函数表中该函数的指针进行调用。

每个对象保存的只是一个虚函数表的指针,C++内部为每一个类维持一个虚函数表,该类的对象都指向这同一个虚函数表。

虚函数表为什么能准确查找相应的函数指针?因为在类设计的时候,虚函数表直接从基类继承,如果覆盖了其中的某个虚函数,那么虚函数的指针就会被替换,因此可以根据指针准确找到该调用哪个函数。

b.虚函数的作用:虚函数用于实现多态,在设计上还有封装和抽象的作用。比如抽象工厂模式。

c.如何实现动态绑定

6.

基类就是父类,派生类就是子类

7.https://blog.csdn.net/nawuyao/article/details/50347655

什么是虚函数?指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数。虚函数用virtual修饰函数名,虚函数的作用是在程序的运行阶段动态的选择合适的成员函数。在派生类中重新定义的函数应该与虚函数具有相同的形参个数和形参类型,参数类型的顺序也要一致,以实现统一的接口。如果在派生类中没有重新定义虚函数,则它继承基类的虚函数。

使用虚函数时:

a.需要在声明函数的类体中使用关键字virtual将函数声明为虚函数,在定义函数时不需要;

b.将基类中某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数;

c.如果类(基类和派生类)中声明了某成员函数为虚函数,则类中不能再出现与之相同的非虚函数
d.非类的成员函数不能定义为虚函数,全局函数以及类的静态成员函数(因为调用类的静态成员函数不需要实例,但调用虚函数需要一个实例)和构造函数(因为构造函数是在对象完全构造之前运行的,构造函数是初始化虚表指针,而当要调用虚函数时需要知道虚表指针,存在矛盾,但构造函数里是可以调用虚函数的)、内联函数也不能定义为虚函数,但一般将析构函数定义为虚函数(如果不把析构函数定义为虚函数,当用基类指针delete时,无法调用派生类的析构函数,派生类部分无法析构)
e.指针声明不调用构造函数

编译器发现一个类中有虚函数时,会立即为此类生成一个虚函数表,虚函数表的各个表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针vptr指向虚函数表。另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体类的this指针,这样依靠this就可以得到正确的table,这样才能真正的与函数体进行连接,这就是动态联编,实现多态的基本原理。

ps:把注意力集中于当前的事情,焦躁不安的心情消散了,路要一步一步的走,管理好自己的情绪,管理好自己的时间和精力,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值