1. 指针和引用的区别
(1)引用只是变量的别名,内部是实现指针,引用不会分配内存空间,指针是实体,需要分配内存空间。指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
(2)引用只能在初始化时被赋值,其他时候不能被改变,指针的值可以在任何时候改变
(3)引用不可以为空,指针可以为空
(4)引用变量内存单元保存的是被引用变量的地址
(5)“sizeof 引用” =指向变量的大小,“sizeof指针”=指针本身的大小
(6)引用使用在源代码级相当于普通变量一样使用,做函数参数时,内部传递的实际是变量地址。
(7)有多级指针,但是没有多级引用,只能有一级引用。
(8)指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时引用的变量值加1)
2. 野指针
野指针指向一个已删除的对象或申请访问受限内存区域的指针。
成因:(1)指针变量未初始化。(2)指针释放后未置空,delete只是把指针所指的内存给释放掉,但并没有把指针本身消除,释放后的指针应立即置null(3)指针操作超越变量作用域。如下
class A {
public:
void Func(void){
cout << “Func of class A” << endl; }
};
class B {
public:
A *p;
void Test(void) {
A a;
p = &a; // 注意 的生命期 ,只在这个函数Test中,而不是整个class B
}
void Test1() {
p->Func(); // p 是“野指针”
}
};
3. 用一个函数实现交换a和b的值
void swap(int*a, int*b)
{
int temp = *a;//内容交换
*a = *b;
*b = temp;
}
有没有优化的方法
(1)异或(位运算)
void swap(int*a,int* b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}//a^a^b=b
(2)算术运算
void swap(int *a, int *b){
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}//a+b-b=a;
4. 数组和链表的区别(略)
5. 解释下面向对象
3大特性:封装、继承、多态
4种特性:封装、继承、多态、抽象
(1)封装:使代码模块化,把过程和数据包起来,通过已定义的接口访问数据,保证了对象被访问的隐私性和可靠性。
(2)继承:类的一种层次模型,其提供了一种明确表述共性的方法,对象的新类可以从现有的类中继承派生,类可以从他的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。继承可以扩展已存在的代码。
(3)多态性:是对象在不同时刻表现出来的多种状态,是一种编译时期状态和运行时期状态不一致的现象。
(4)抽象:是指对一类事物的高度提炼以得到共同的共性部分,抽象不需要了解全部细节,而只是一种通用的描述约束,抽象可以是过程抽象或者数据抽象。
补充:public,private,protected
protected表明成员变量以及方法对所有的用户是公开的,任何用户可以直接调用,对象可以访问。
private表明成员变量以及方法是私有的,只有类内成员以及友元函数可以访问,对象不可以访问。
protected表明该类中的函数、子类的函数、以及其友元函数可以访问。但不能被该类的对象访问。
protected继承:public变为protected,其他属性不变<