1. 面向对象的三个特征
封装:隐藏细节,数据和方法实行public,private,protece
继承:不修改的前提下扩展功能
多态:将父类设置成于子类对等地执行操作
2. 重载和重写
重载是函数名相同,参数不同
重写是函数名相同,参数相同,子类重新定义父类的虚函数
3. 什么情况下必须使用构造函数初始化列表
(1) 类中有const和引用类型的成员。
(2) 类中有某个成员类没有public的默认构造函数
4. C++是不是类型安全的
不是。两个不同类型的指针之间可以强制转换
5. main 函数执行以前, 还会执行什么代码?
全局对象的构造函数会在main 函数之前执行
6. 内存分配方式以及它们的区别
(1) 静态储存区:例如全局变量,static 变量,在程序编译的时候就已经分配好,的整个运行期间都存在。
(2) 堆:称动态内存分配。程序在运行的时候用malloc 或 new,的生存期由程序员决定
(3) 栈:执行函数时,函数内局部变量在栈上创建,函数执行结束时自动释放
7.static_cast、dynamic_cast、reinterpret_cast和const_cast
static_cast:类层次结构中基类和子类之间指针或引用的转换,没有类型检查,编译时进行
dynamic_cast:类层次结构中基类和子类之间指针或引用的转换,有类型检查,运行时进行
reinterpret_cast:不同类型的指针间的转换
const_cast:常量和非常量的转换
8. UML图中的关联,聚合,组合
关联:两个类一般的关系
聚合:a可以有0个或者多个b
组合:a必须有指定数量的b
9.explicit 的作用
只对构造函数起作用,用来抑制隐式转换
10. 引用的一些理解
(1) 引用就是某个目标变量的“别名”,引用本身不占存储单元,系统也不给引用分配存储单元。
(2) 不能建立数组的引用
(3) 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;
(4) 使用常引用:既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变
(5) 不能返回局部变量的引用
(6) 不能返回函数内部new分配的内存的引用 (否则的话会造成内存泄漏,编译器帮我们避免了)
(7) 一个基类的引用可以指向它的派生类实例
(8) “引用”与指针的区别是,指针是用一个指针变量去指向一个对象,引用是对象的别名
11. strlen的理解
(1) strlen(char*)函数求的是字符串的实际长度
(2) sizeof是运算符,strlen是函数
(3) sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的
(4) 数组做sizeof的参数不退化,传递给strlen就退化为指针了
(5)sizeof编译时执行,strlen运行时执行
12. sizeof的理解
(1) 不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算
(2) 是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
(3) sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用
比如,sizeof( foo() ); foo() 是函数调用
(4) C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值。
比如,sizeof( foo );// foo 是函数
(5) sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用
(6) 基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同
(7) 指针变量的sizeof值与指针所指的对象没有任何关系
(8) 数组的sizeof值等于数组所占用的内存字节数, 注意,是内存字节数
(9) 数组作为参数时,会退化为指针
(10) sizeof时要注意字节对齐
(11) 结构体的总大小为结构体最宽基本类型成员大小的整数倍
(12) 结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目
(13) 整个联合体的sizeof也就是每个成员sizeof的最大值
13.进程和线程的区别
13.1 进程和线程的区别:
(1) 资源:进程是资源分配的基本单位,资源分配给进程
线程是调度的基本单位,处理机分给线程
(2) 地址:进程有独立的地址空间
线程有自己的堆栈和局部变量,但没有单独的地址空间, 一个线程死掉就等于整个进程死掉.
(3) 通讯:进程间通信:消息通信
线程间通信: 直接读写进程公共数据
(4) 两者之间的关系: 一个线程只能属于一个进程
一个进程可以有多个线程,但至少有一个线程
13.2 线程比进程好的地方:
(1) 易于调度
(2) 创建开销少。创建线程比创建进程要快