一、指针与引用有什么区别?
1、指针会占用内存,引用不占用内存。
2、引用在定义时必须初始化。
3、没有空的引用,但是有空的指针。
二、static关键的几个作用
1、函数体内的static变量的作用范围为该函数体,该变量内存只分配一次,因此其值在下次再调用该函数时仍维持上次的值。
2、在模块内的static全局变量可以被模块内的其他函数访问,但不能被模块外的函数访问。
3、在模块内的static函数只能被模块内的其他函数调用,但不能在模块外调用该函数。
4、在类中的static成员变量属于整个类拥有,对类的所有对象只有一份拷贝。
5、在类中的staitc成员函数属于整个类拥有,这个函数不能接收this指针,因而只能访问类的static成员变量。
三、const关键的几个作用
1、可用于定义常量,用于阻止定义的变量被改变,定义时通常要进行初始化,在类中通常在构造函数中初始化。
2、const定义的指针可以指定指针本身为const不可变的,也可以指定指针所指向的数据为const不可变,还可以同时指定二者都为const不可变。
const char *p = "Hello world!"; //指针指向的数据为常量
char* const p = "Hello world!"; //指针本身为常量
const char * const p = "Hello world!"; //指针本身与其所指数据都为常量
3、在一个函数的声明中,const可修饰形参,表明是一个输入参数,在函数内部不能改变其值。
4、对于类的成员函数,若指定为const类型,则表明该成员函数为常函数,不能修改类的数据成员。
5、对于类的成员函数,有时必须指定其返回值为const类型,以使得其返回值不为“左值”。
四、数组与链表的区别
1、数组在内存中是连续的,链表在内存中是不连续的,靠指针连接。
2、数组占用的总内存相对链表要小,因为链表除了要保存数据外,还要保存用于连接的指针。
3、数组方便排序和查找,但不方便删除和插入;而链表则方便删除和插入,不方便排序和查找。
五、指针数组与数组指针
int *a[10]; //10个int型指针数组
int (*a)[10]; //10个int型数组的指针
int (*a)(int); //带一个int型参数,返回值为int型的函数指针
int (*a[10])(int); //10个函数指针数组,函数带一个int型参数,返回值为int型
六、一下为windows NT下的32位C++程序,请计算sizeof的值
void Func(char str[100])
{
sizeof(str) = ?; //由于str是形参,原本是数组被降级为指针,因此此处结果为4个字节
}
void *p = malloc(100);
sizeof(p) = ?; //此处p为指针,因此结果为4个字节
int a[100];
sizeof(a) = ?; //此处a为一个100的整型数组,因此结果为100*4,400个字节
char *p = "aaaaaaaa";
sizeof(p) = ?; //此处p仍然为一个指针,因此结果为4个字节
七、STL常用类
1、向量
2、列表
3、集合
4、栈
5、队列
6、映射
八、C++中常用的设计模式
1、Factory Method 工厂模式
2、Strategy 策略模式
3、Singleton 单例模式
4、Iterator 迭代器模式
5、Bridge 桥接模式
6、Composite 组合模式
7、Observer 观察者模式
8、Proxy 代理模式
9、Adepter 适配器模式
10、Abetract Factory 抽象工厂模式
九、类与对象的区别
类与对象的却别如人类与张三的区别,他们是一般与个别、抽象与具体、集体与个体的区别。
十、 面向对象的三大特征:封装、继承、多态
1、封装
把客观事物封装成抽象的类,且类可以把自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏的技术称为封装。
在C++中类成员的属性有:public, protected, private,访问权限依次降低。
2、继承
可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展的技术被称为继承。
继承出来的新类被成为“子类”、“派生类”;被继承的成为“父类”、“基类”或“超类”。
3、多态
允许将父对象设置成为和一个或多个子对象相等的技术称为多态。
实现多态的方法:覆盖、重载
覆盖:指子类重新定义父类的virtual虚函数的做法。
重载:指允许存在多个同名函数,而这些函数的参数表不同。
十一、成员函数与友元函数的区别
1、成员函数是类定义的一部分,通过特定的对象来调用。成员函数可以隐式访问调用对象的成员,而不须使用成员操作符。
2、友元函数不是类的组成部分,因此被成为直接函数调用。友元函数不能隐式访问类成员,而必须将成员操作符用于作用参数传递的对象。
十二、分别给出BOOL,int,float,指针变量与“零值”比较的if语句
1、bool型变量:if(!var){}
2、int型变量:if(var == 0){}
3、float型变量:
const float EPSINON = 0.000001;
if(( x >= -EPSINON ) &&( x <= EPSINON )){}
4、指针变量:if( var == NULL ){}
十三、内存问题
1、内存分配方式有三种:
a、从静态存储区中分配内存。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量等。
b、在栈上创建。在执行函数时,函数内局部变量的存储但愿都可以在栈上创建,函数执行结束时,这些存储单元自动释放。
c、从堆上分配,亦称动态内存分配。程序在运行时用malloc或new申请任意多少内存,程序员自己负责在何时用free或delete释放内存。
2、内存分为5大区域:
a、代码段——源代码程序编译产生的二进制数据
b、BSS区(全局区,静态区)——未初始化的全局变量和静态变量
c、数据段(常量区)——已经初始化的全局变量和静态变量
d、栈区——存放全局变量,临时变量
e、堆区——程序运行过程中,动态分配的内存