1.关键字static的作用?
(1)函数体内:static修饰的局部变量作用范围为该函数体,不同auto变量,其内存只被分配一次,因此其值在下次调用的时候维持了上次的值。
(2)模块内:static修饰全局变量或全局函数,可以被模块内的所有函数访问,但是不能被模块外的其他函数访问,使用范围限制在声明它的模块内。
(3)类中:修饰成员变量,表示该变量属于整个类所有,对类的所有对象只有一份拷贝
(4)类中:修饰成员函数,表示该函数属于整个类所有,不接受this指针,只能访问类中的static成员变量。
注意:与const的区别,const强调值不能被修改,而static强调唯一的拷贝,对所有类的对象。
2.什么是内存泄漏?面对内存泄漏和指针越界,你有那些方法?
(1)动态分配内存所开辟的空间,在使用完毕后未手动释放,导致一直占据该内存,即为内存泄漏
(2)方法:malloc/free要配套使用,对指针赋值的时候应该注意被赋值的指针是否需要释放;使用的时候记得指针的长度,防止越界。
3.定义和声明的区别?
(1)声明是告诉编译器变量的类型和名字,不会为变量分配空间。
(2)定义需要分配空间,同一个变量可以被声明多次,但是只能被定义一次
4.静态绑定和动态绑定的介绍?
静态绑定和动态绑定是C++多态性的一种特性。
(1)对象的静态类型和动态类型
静态类型:对象在声明时采用的类型,在编译时确定
动态类型:当前对象所指的类型,在运行期决定,对象的动态类型可变,静态类型无法更改。
(2)静态绑定和动态绑定
静态绑定:绑定的是对象的动态类型,函数依赖于对象的动态类型,在运行期确定。
动态绑定:绑定的是对象的动态类型,函数依赖于对象的动态类型,在运行期确定
只有虚函数才使用的是动态绑定,其余的全部是静态绑定。
5.引用作为函数参数以及返回值的好处?
对比值传递,引用传参的好处:
(1)在函数内部可以对此函数进行修改。
(2)提高函数调用和运行的效率(所以没有了传值和生成副本的时间和空间消耗)
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参-》形参),参数 的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递的过程,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
用引用作为返回值最大的好处就是在内存中不产生被返回值的副本。
但是仍有以下的限制:
(1)不能反回局部变量的引用。因为函数返回以后局部变量就会被销毁
(2)不能反回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(反回函数内部new分配内存的引用),又面临其它尴尬局面。例如:被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak
(3)可以返回类成员的引用,但是最好是const。因为如果其他对象可以获得该属性的非常量的引用,那么对该属性的单纯赋值就会破坏业务规则的完整性。