c++知识点框架
来源:互联网 发布:一直播如何挂淘宝链接 编辑:程序博客网 时间:2024/05/29 06:27
1
类
1.类的定义
class 类名称
{
public:
外部接口
protected:
保护型成员
private:
私有成员
} ;
2.类和结构体的区别
比较内容
结构
类
构造函数
支持(不能自定义,默认提供,作用是将所有的数据成员置零)
支持(能自定义)
析构函数
不支持
支持
变量初始化
不支持(private int num = 50 是错误的)
支持
继承
不支持(sealed类型)
支持
接口
可以实现多个接口
可以实现多个接口
特性
支持
支持
属性
支持
支持
方法
支持
支持
类型
值类型
引用类型
3.函数重载,封装概念
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这为函数的重载。
封装概念:将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成“类”,其中的数据和函数都是类的成员。
4.this指针
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数给函数。
5.public、protected的区别
public:为公有类型成员定义了类的外部接口。
protected:保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中产生的新类影响不同。
6.类的作用范围
类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分。每一个类都具有该类的类域,该类的成员局部于该类所属的类域中。
7.inline的原理,inline和宏区别
宏不可以访问私有成员,并且容易出现二义性,
inline相对比宏更加实用。
详见 http://blog.csdn.net/lw370481/article/details/7311668
8.面向过程,面向对象区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
2
构造函数
1.类和对象的区别
类:指通过对现实世界的对象进行数据抽象和功能(行为)抽象,得到类的数据成员和函数成员。
对象:指定义一个类后,便可以定义该类的变量,这个变量就称为类的对象,这个定义的过程也称为类的实例化。
2.冒号语法、构造函数的执行流程(冒号语法需要性,对象初始化和赋初值)
冒号语法:指在构造函数中,小括号之后花括号之前,使用冒号对私有成员变量赋初值,在实际程序中必不可少。
构造函数的执行流程:先执行冒号语法中赋值,在执行函数体,根据参数不同调用相应的构造函数
3.对象的内存布局
详见http://blog.csdn.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)
- 框架知识点
- c知识点
- C 知识点
- Spring框架知识点
- 线性代数知识点框架
- MVC框架中知识点
- 集合框架知识点
- loushang框架知识点整理
- Spring 框架知识点汇总
- [s2sh框架]Hibernate知识点
- struts框架基础知识点
- NSURLSession/AFN框架知识点
- Foundation 框架知识点
- 集合框架基础知识点
- laravel框架知识点记录
- 框架知识点总括
- JavaSE知识点框架图
- 集合框架知识点
- (TCP模式)客户端与服务器之间的文件传输
- tomcat配置目录映射,以及前台如何访问的注意事项
- JS学习笔记1-JavaScript 输出
- 图的基本存储的基本方式三
- Spring中配置数据源
- c++知识点框架
- 【HDU
- E
- 反射应用进阶篇之自定义反射工具类在springmvc中的应用
- C++ #define
- python实现判断给定列表是否存在重复元素,且索引差小于k
- combobox实现下拉框及其值的获取
- 使用list方法插入datatable中的数据到数据库
- Power Strings(POJ-2406)(KMP简单循环节)