c++知识点框架
1 |
类 |
1.类的定义 class 类名称 { public: 外部接口 protected: 保护型成员 private: 私有成员 } ; 2.类和结构体的区别
3.函数重载,封装概念 两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这为函数的重载。 封装概念:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成“类”,其中的数据和函数都是类的成员。 4.this指针 this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数给函数。 5.public、protected的区别 public:为公有类型成员定义了类的外部接口。 protected:保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中产生的新类影响不同。 6.类的作用范围 类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分。每一个类都具有该类的类域,该类的成员局部于该类所属的类域中。 7.inline的原理,inline和宏区别 宏不可以访问私有成员,并且容易出现二义性, inline相对比宏更加实用。 详见 http://blog.****.net/lw370481/article/details/7311668 8.面向过程,面向对象区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 |
||||||||||||||||||||||||||||||
2 |
构造函数 |
1.类和对象的区别 类:指通过对现实世界的对象进行数据抽象和功能(行为)抽象,得到类的数据成员和函数成员。 对象:指定义一个类后,便可以定义该类的变量,这个变量就称为类的对象,这个定义的过程也称为类的实例化。 2.冒号语法、构造函数的执行流程(冒号语法需要性,对象初始化和赋初值) 冒号语法:指在构造函数中,小括号之后花括号之前,使用冒号对私有成员变量赋初值,在实际程序中必不可少。 构造函数的执行流程:先执行冒号语法中赋值,在执行函数体,根据参数不同调用相应的构造函数 3.对象的内存布局 详见http://blog.****.net/ljianhui/article/details/45903939 4.析构函数的执行流程 析构函数是在对象的生存期即将结束的时刻被自动调用的函数 5.函数参数的默认值(缺省构造函数的注意点) 在相同的作用域内,不允许在同一个函数的多个声明中对同一个参数的默认值重复定义,即使前后定义的值相同也不行。函数的定义也属于声明,如果一个函数在定义之前又有原型声明,默认形参值需要在原型声明中给出,定义中不能再出现默认形参值。 |
||||||||||||||||||||||||||||||
3 |
堆 |
1.堆内存的存在意义,C++的内存布局 堆区:指由程序员自己分配释放的空间 详见http://blog.sina.com.cn/s/blog_69e6c0030102w7yi.html 堆,栈区,静态存储器的区别 c++的内存布局: 分为5种不同的数段 c++的内存布局: 分为5种不同的数:段代码段,数据段,BBS段,堆(heap),栈 2.malloc、free和new、delete的区别 malloc和free 的作用仅仅是开辟和释放空间 而new和delete在开辟空间同时,调用了构造函数析构函数 3.拷贝构造函数 在用对象赋值时,产生新对象 调用对应的构造函数函数实现。 4.深浅拷贝的使用及区别 浅拷贝:
深拷贝:
5.理解临时对象的产生原理 临时对象是为了满足对象内部私有成员的传递而产生的对象。 |
||||||||||||||||||||||||||||||
4 |
静态成员 |
1.静态成员变量(声明及初始化地方) 关键词 static 为了解决同一个类的不同对象之间数据和函数共享问题,声明在成员前加上static,初始化最好习惯在声明的时候 2.静态成员函数和this指针的关系 静态成员函数和静态数据成员的性质相似,它们都是独立于对象而属于类的。静态成员函数不属于对象,所以它没有this指针,没有了this指针那么静态成员函数也就无法访问类的非静态数据成员 3.静态成员的使用环境 类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的,而静态数据成员具有静态生存期。 4.总结C和C++语言中static用法 定义成静态变量后,使用时的值为上次的值。 作用:隐藏,保持变量内容持久,可以默认初始化为0 5.友元的局限性 (1)友元关系不能被继承 。 (2)友元关系是单向的,不具有交换性。若类B是类A的友元,类A则不是B的友元,要看在类中是否有相应的声明。 (3)友元同事不具有传递性。 |
||||||||||||||||||||||||||||||
5 |
继承和多态 |
1.继承使用的前提条件 两个类存在一的关系 2.派生类对象的内存布局 一.单一继承 (1)派生类完全拥有基类的内存布局 (2)虚指针只存在一个 二.多重继承 VS的内存布局是按照声明顺序排列内存 三.虚拟继承 (1)虚继承是是为了防止“diamond”继承所带来的问题。 (2)虚继承与普通继承的区别 普通继承使得派生类每继承一个基类便拥有一份基类的成员。而虚拟继承会把通过虚拟继承的那一部分,放在对象的最后。从而使得只拥有一份基类中的成员。虚拟对象的偏移量被保存在Derived类的vtbl的this指向的上一个slot。通俗来说就是,如有有相同的,就继承一份。 (3)虚拟继承的内存布局:每个派生类会把其他不变部分放在前面,共享部分放在后面 3.派生类的构造流程 (1)按照继承顺序执行virtual基类的构造 (2)按照顺序执行非virtual类构造 (3)执行自己的构造 4.继承和组合的区别 组合是在一类类中引用另一个类。生成另一个类的实例。 5.多态(必备条件) (1)两个以上的类必须是父子关系 (2)基类和子类中必须要有同名同参函数,基类中的函数必须是虚,子类可以继承虚(故子类可以定义成非虚) (3)必须是基类的指针或引用指向基类或子类对象。 6.虚表的工作原理 虚表的内容是依据类中的虚函数声明次序--填入函数指针。派生类别会继承基础类别的虚表(以及所有其他可以继承的成员),当我们在派生类中改写虚函数时,虚表就受了影响;表中的元素所指的函数地址将不再是基类的函数地址,而是派生类的函数地址。 7. 纯虚函数和抽象类 纯虚函数: 定义:class <类名> { virtual <类型><函数名>(<参数表>)=0;}; 抽象类:包含纯虚函数的类。注意抽象类不能定义对象,但是可以定义抽象类的指针或引用,主要作用是为了派生子类。
8.多重继承,虚继承 9.private继承的意义
|
||||||||||||||||||||||||||||||
6 |
运算符重载 |
1.运算符重载的注意事项 (1)c++中三目运算符“?:”,sizeof,类关系运算符“.”, 成员指针“.*”,作用域分辨符“::”不能重载。 (2) 重载之后的运算符的优先级和结合性不会改变。 (3) 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,重载功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少有一个操作对象是自定义类型。 2.值返回与引用返回的区别 通常的返回机制将返回值复制到临时存储区域中, 随后调用程序将访问该区域. 返回引用则程序则调用程序将直接访问返回值.通常引用将指向传递给函数的引用, 因此调用函数实际上是直接访问自己的一个变量. 3.赋值运算符的深浅拷贝问题 注意:如果当前这个类需要写析构函数去释放资源,则需要写拷贝构造函数去深拷贝资源,若要写析构函数,则说明堆上空间需要释放,如果有对象的拷贝,则新对象的空间也需要申请和旧对象一样的空间大小 4.实现string类构造、析构、拷贝构造、operator=、和operator+函数 例: #include using namespace std; #include class mystring { public: mystring(char *str = "") { Str = new char[strlen(str)+1]; strcpy(Str,str); } ~mystring() { delete []Str; } mystring(mystring &s) { Str=new char[strlen(s.Str)+1]; strcpy(Str,s.Str); } mystring operator+(mystring &s) { char *p=new char[strlen(s.Str)+strlen(this->Str)+1]; strcpy(p,Str); strcat(p,s.Str);
mystring t(p); free(p); p=NULL; return t; } mystring operator=(mystring &s) { Str=new char[strlen(s.Str)+1]; strcpy(Str,s.Str); return Str; } void show() { cout<<Str<<endl; } friend ostream& operator<<(ostream &out,mystring &a); private: char *Str; }; ostream& operator<<(ostream &out,mystring &a) { out<<a.Str; return out; } void main() { mystring a("123"); a.show(); mystring b="456"; b.show(); mystring c; (a+b).show(); c = a+b; c.show(); cout<<c<<endl; }
|
||||||||||||||||||||||||||||||
7 |
模板和STL |
1.函数模板和类模板的形式 2.理解模板为程序编写带来的便利 3.掌握vector、list、string等常用容器 4.会使用迭代器 5.掌握STL中常用的排序及查找算法(find_if,find,sort,search copy,reverse, merge, for_each) |