C++基础
1.面向对象基本概念:
类,对象,封装,继承,多态
2.基本数据类型:
Bool char --1, short --2, int long --4, float --4, double --8.(Vc++2008 , gcc4.2)
没有明确规定取值范围,只规定顺序Char<short<int<long
3.引用:
声明引用的同时要初始化,且以后不能改变指向,相当于变量的别名。
4.inline:
非常小且经常使用的函数设计为内联函数,在调用时不发生控制转移,而是嵌入在调用处。系统并不保证有inline的为内联,没有inline也有可能被编译成内联。递归函数无法内联。
5.默认值的形参:
声明中从右到左给出默认值,实现不给出。
6.重载:
参数类型不同,参数个数不同,有无const,(返回值不同,其他相同会编译错误),(带默认值的函数,和重载函数要注意二义性,避免编译错误)
7.多态:不同对象,接受同样消息,表现不同行为
强制多态(显或隐的类型转换),重载多态(函数,运算符(./.*/::/?:)不能重载),包含多态(虚函数),模板多态(参数化多态)
8.构造函数
(如果构造函数可以一个参数调用,那么相当于设定了类型转换,如果没必要则要使用,explicit修饰构造函数,避免转换被误用)
-先执行一次虚基类构造,按照继承声明顺序调用其他基类构造,新增内嵌对象初始化,函数体内容。
9.复制构造
类对象初始化对象,非引用的形参实参相结合,返回值是类对象
10.类和结构体和联合体
-类和结构体唯一区别是,默认的访问属性不同,类默认私有,结构体默认公有。存数据可优先结构体。
-联合体全部数据成员共享内存单元,只有一个数据成员有意义。比如等级,分数,通过
11.位域:
Bool, char, int ,enum, 可以定义位域指定占用空间大小,节约空间,但是占用打包解压时间。(联合体没必要定义位域)。
12.static:
-类外:+static会对其他源文件隐藏变量或函数;初始化为0,存在BBS段;局部维持变量内容持久。
-类内:必须在类外定义;属于类本身,最好使用static函数调用节省this开销。没有const static函数。
13.friend:
单向,不能传递,不能继承
14.const 成员函数:
Const函数不能改变成员变量的值,但能改变mutable成员变量的值。
15.指向函数的指针:
void (* func)(int);
func=func1; func(x);
-指向非静态成员指针:
Int A:: *pt; int A:: (*fptr)()const;
16.new:
int *ptr=new int(); delete ptr;
Int *prt=new int[10](); delete [] ptr;
17.虚基类:
在多继承当中,使中间父类virtual继承最终基类0,是的最后的子类中只有一个基类0的变量副本。而不是父类个数个变量。
在整个多继承当中,虚基类的所有派生类都要在初始化中调用虚基类的构造函数。但是只有最小派生类才会调用一次。
18.虚函数作用和实现原理:
C++中的虚函数的作用主要是实现了多态的机制。根据类型兼容规则,当子类对象转换成父类对象时(指针,引用,直接转),子类新增成员将丢失。然而通过虚函数,用父类的指针指向其子类的实例时,可以调用实际子类的虚函数成员。
-同名隐藏:隐藏所有子类中与父类同名的函数及其重载形式(只有在相同的作用域才能重载)。
19.子类->父类:声明一个子类构造函数,参数为父类对象
20.抽象类和纯虚函数:
带有未实现的纯虚函数的类是抽象类,无法实例化,只能指针/引用。
纯虚函数声明时=0,可以不给出实现。只有纯虚析构函数才必须给出实现。
21.类占用空间:
-属性占用空间,而成员函数一般不占用空间,一个虚函数占用空间只占用4个字节
-子类占用空间是父类基础上增加本类空间
-静态成员变量不占用类空间
-虚函数表vtbl地址在类地址的最前面,一个父类一条表。虚函数表指针vtpr在对象地址的最前面。
-虚函数表地址的前面设置了一个指向type_info的指针,RTTI(Run Time Type Identification)运行时类型识别是有编译器在编译器生成的特殊类型信息,包括对象继承关系,对象本身的描述,RTTI是为多态而生成的信息,所以只有具有虚函数的对象在会生成。
22.空类六大默认成员函数分别是:
构造函数、拷贝构造函数、析构函数、赋值运算符重载、取地址操作符重载、被const修饰的取地址操作符重载
23.STL:
Vector:高效尾部处理,内存变化后迭代器失效。Size/capacity/reserve(Count) 函数主要是预留Count大小的空间。(1)另觅更大空间;(2)将原数据复制过去;(3)释放原空间三部曲。
List:双向环状链表,不能随机访问,内存不连续,除了指向被删除元素的迭代器,其他不会失效。
Deque:两端高效地插入数据、支持随机访问的容器(可以对其进行随机访问,但效率比vector低很多。)deque的内存重分配优于vector。