一.C++ 零散知识点

来源:互联网 发布:淘宝首页轮播代码 编辑:程序博客网 时间:2024/06/04 19:39

cc++的区别

c和c++的区别

  1. 思想不一样。C是面向过程的而C++是面向对象的
  2. C是C++的子集,而C++是C的超集。最开始的时候C++就叫做C with classes,C++在C的基础上引入了封装、继承、多态、模板、异常处理,STL等新的元素

面向对象的基本特征

1、封装:就是把客观事物封装成类,类封装了数据和操作数据的方法,并且类内的数据和操作数据的方法只开放给可信的类和对象操作,实现信息的隐藏;

2、继承:在已有的类的基础上,通过添加和修改少量的代码得到新的类,子类能继承父类的数据和操作数据的方法,同时能够添加子类独有的数据和操作数据的方法,实现了代码重用,提高开发效率;

3、多态:多态有静态多态和动态多态,静态多态是通过函数重载实现的,函数重载具有相同的函数名,系统会根据参数调用对应的函数;动态多态是通过虚函数实现的,指针调用虚函数的时候,系统会根据指针所指向的对象决定调用哪个函数。

new和delete

malloc和free

1)使用malloc必须使用sizeof计算所需要的字节数,而new能自动根据数据类型计算所需分配的内存的大小,减少了发生错误的可能性

2)new能自动的返回正确的指针类型,而malloc必须进行强制类型转换

3)malloc/free是C标准库函数,new/delete是C++的运算符

stringchar*区别?

string的内存管理是由系统处理,除非系统内存池用完,不然不会出现这种内存问题。

char *的内存管理由用户自己处理,很容易出现内存不足的问题。

 

当我们要存一个串,但是不知道其他需要多少内存时, 用string来处理就最好不过了。

当你知道了存储的内存的时候,可以用char *,但是不如用string的好,用指针总会有隐患。

 

用string还可以使用各种成员函数来处理串的每一个字符,方便处理。

用char *处理串,就不如string的方便了,没有相应的函数来直接调用,而是要自己编

写函数来完成串的处理,而且处理过程中用指针还很容易出现内存问题。

 

我建议尽量使用string,不用char*;

尽量使用vector(关联数组),不用数组;

尽量使用迭代器,而不用指针。

strlen和sizeof

char str[20]="0123456789";

int   a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。

int   b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响

 

strlen是函数,要在运行时才计算,只能用char* 做参数,功能是:返回字符串长度

sizeof是运算符,在编译时就算好了,可以用类型作参数,功能是:获得保证能容纳实现所建立的最大对象的字节大小

指针和引用

(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元

(2)可以有const指针,但是没有const引用;

(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

(7)指针和引用的自增(++)运算意义不一样;

Ps:

在讲引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。

 

指针数组

数组指针

 

指针函数

函数指针

右左规则:

int   *p[4];         //指针数组。  是个有4个元素的数组, 每个元素的是指向整型的指针。(数组的每个元素都是指针)

int   (*p)[4];       //数组指针。 它是一个指针,指向有4个整型元素的数组。       (一个指针指向有4个整型元素的数组)

 

int *func(void);     //指针函数。 无参函数, 返回整型指针。             (函数的返回值为int*)

int (*func)(void);   //表示函数指针,可以指向无参, 且返回值为整型指针的函数。      (函数的返回值为int)

堆和栈区别

    • 栈是由系统自动分配的,速度块,程序员无法控制;堆需要程序员自己申请和释放,容易产生内存碎片,自由度高;
    • 栈是向低地址扩展的数据结构,是一块连续的内存区域;堆是向高地址扩展的数据结构,系统用链表存储空闲内存地址,因此是不连续的;
    • 栈未初始化的时候是0xcccc;堆未初始化的时候是0xcdcd;分别对应中文GB2312编码中分别对应“烫”字和“屯”字
原创粉丝点击