Q:C和C++还有java的区别
Q:指针和引用的区别?
1.指针是一个存储地址的变量,该地址为内存的一个存储单元;引用是原变量的一个别名;
2.指针可以为空,而引用不能为空;
3.指针可以有多级,而引用只能有一级;
4指针可以重新赋值,而引用只能初始化一次
5.sizeof引用得到的是变量大小,而sizeof指针得到的是指针本身大小
将引用作为函数返回值的好处是?
在内存中不会产生被返回值的副本,同时不能返回局部变量的引用,因为随着调用结束局部变量会被销毁。
Q:三种传参方式?
值传递:传递的是实参的一个拷贝,修改形参不会改变实参值。
地址传递:传递的是实参地址的一个拷贝,修改形参不会改变实参值。
引用传递:传递的是实参的一个别名,修改形参会导致改变实参。
被调用函数的形参只有在被调用时才会临时分配存储单元,一旦调用结束则释放内存。
Q:const作用?
被const修饰符修饰的变量不能被修改。const *x表明x数据是常量,不能修改;*const x表明指针本身是常量,x的指针不能指向其他内存地址,x本身可被修改;*const *x表明x本身数据和地址都不能被修改。
Q:static作用?
被static修饰符修饰的变量在整个文件中都是可见的,而在文件外是不可见的。该变量在全局数据区分配内存。C++中由程序运行new出的动态数据存放在堆区,而函数内部局部变量存放在栈区。
静态局部变量:在函数内部定义static变量,第一次运行到这里初始化,存储到全局数据区,下一次执行到这里不会再重新初始化。
static变量如果没有显式初始化,默认初始值为0。 静态函数不能被其他函数所调用。
Q:面向对象的三个要素(基本特征)?
1、封装:将客观事物封装成类,隐藏实现细节,模块化代码。
2、多态:实现多态的两种方式——覆盖(重写)和重载。
覆盖是子类重新定义父类的虚函数,与多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。
重载是存在多个同名函数,但是函数的参数个数不同。这些函数实际上成为了不同的函数,对它们的调用在编译期间就已经确定,属于早绑定,与多态无关。
3、继承:子类继承父类功能,对父类功能进行扩展。
Q:结构体和联合有什么区别?
(1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。
(2). 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
Q:C++是不是类型安全的语言?
不是。不同类型间指针可以强制互转。
Q:const与#define区别?
(1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
(2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
(3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
(4)从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。
Q:基类的析构函数为什么是虚函数?
为了防止派生类析构函数未执行,造成资源泄露。
Q:#include尖括号和双引号区别?
<>是标准头文件,“”是非系统头文件
Q:为什么有了指针,还要使用引用?
为了支持运算符的重载。更加方便。
Q:如何避免野指针?
声明指针记得初始化,暂时不用就指向NULL;使用malloc分配内存,必须经过显式释放(free),避免内存泄漏。