C++知识点总结(上):指针和引用,static关键字,const关键字,malloc\free和new\delete的区别等

时间:2022-06-30 00:40:13
                                C++问题总结(上) 1.函数传指针引用的区别?    (1).引用定义必须初始化,指针可以不用    (2).指针可以和多个实体结合,引用只能和一个实体结合??    (3).没有空引用,但是有控制指针    (4).有多级指针,但是没有多级引用    (5).引用比指针用起来更安全,不用判空    (6).sizeof求值意义不相同。--sizeof(指针)是指针所占的字节数,32位(4),64位                                               --sizeof(引用)是引用所指的实体类型的大小    (7).自加减意义不同。指针++是指针向后偏移类型个字节??                                     而引用则是+1
2.malloc\free  和 new\delete 的区别?      **double *p =(double*)malloc(sizeof(double)*数字)     (1).malloc\free 是函数;new\delete是操作符     (2).malloc要手工计算字节数;而new自动计算分配空间     (3).malloc只是单纯的申请内存空间<无法满足动态对象的要求>;new、delete         会调用构造函数和析构函数     (4).malloc返回时需要判空;new直接抛异常     (5).malloc返回值是void*,调用时malloc要显示进行类型转换<强制类型转换          >;new返回对象的类     联系:     (1).malloc\free 和new\delete要配对使用     (2).c++ 提供了new[]\delete[]来处理数组类型     (3).new的底层会调用malloc,delete的底层会调用free     operator new\operator delete & operator new[]\operator delete[]     (1).他们和malloc的用法一样      (2).他们只负责分配空间\释放空间,不会调用对象的构造函数和析构函数来初始化            和清理对象      (3).实际上operator new\operator delete只是malloc\new的一层封装
3.static关键字    static可修饰局部变量,全局变量,函数     在修饰局部变量时:     (1).在静态区开辟     (2).生命周期为整个函数的运行时间,默认初始化为0     (3).变量具有记忆功能,即每次保存上一次调用后的值(在静态存储区保存)     (4).在函数第一次调用时创建,构造函数只调用一次??    在修饰全局变量和函数时:     在文件作用域中使用可改变链接属性,仅在当前文件中使用     在修饰类的成员变量和函数时:static静态成员     (1).静态成员为对象所共享,不属于某个实例     (2).访问类的静态成员---类名::静态成员或对象.静态成员     (3).静态成员必须在类外定义,定义时不添加static关键字     (4).类的静态成员没有默认的this指针,因此在类里面不能使用任何非静态成员     (5).静态成员和其他类一样,也具有public\protected\private3种访问级别,也具          有返回值,也能被const修饰
4.const关键字(及const和#define的区别?)     (1).const可以定义常量,具有不可变性(从汇编的角度,const常量只给出了地址,           而宏给出了立即数)     (2).防止意外修改,增强程序的健壮性     (3).会进行类型检查,使编译器对处理内容有所了解,消除一些隐患     (4).同#define一样,不变则已,一变都变(但是宏只进行字符替换,缺乏类型检测)     (5).可以节省空间,避免不必要的内存分配          const定义常量,只分配一次内存----#define定义,有若干个内存分配     (6).提高效率     C和C++中const的区别:     (1).C中,const定义变量时它还是变量,只是具有了常性,不可修改     (2).C++中,const定义变量,认为是常量
5.#define和函数的区别?                                    宏                                                函数 代码长度---- 调用一次,代码加长一次 -----  每次都调用同一个代码 执行速度----执行速度较快 -----   由于参数压栈的开销,执行速度较慢 操作符的优先级----必须加括号-----调用时求一次值,将结果传给函数 参数求值----每次调用重新求值,参数具有副作用-----参数求值传给函数 参数类型----与类型无关---参数与类型有关 是否调试----不可调试-----可调试 返回值-----可以得到多个结果----只能返回一个结果写类型固定
6.struct和class的区别?      默认访问权限不同:struct是public,class是private
7.C++中的封装:(访问限定符public,protected,private)     隐藏对象的属性和实现细节,仅仅对外提供一些公开接口和对象进行交互,将数据和操作数据的方法进行有机结合
8.面型对象与面向过程的区别?    面向过程程序设计方法:采用函数(过程)来对数据操作处理,又将函数与其操作                                           的数据分离开来----以过程为中心,难于维护    面向对象程序设计方法:是将数据和对象的操作封装在一起,作为一个整体来处理                                           ----以数据为中心,稳定性强,易于维护
9.C\C++的对比    (1).文件后缀不同,C 通常是.c结尾,C++通常是.cpp结尾    (2).默认返回值不同和缺省参数不同,若一个函数没有指定返回值C默认返回int型,         C++默认返回void型    (3).默认参数列表不同,在没有指定参数列表的情况下,C默认接受多个参数C++默         认void不接收任何参数    (5).解决问题的思想和方法不同,C 是面向过程的,C++是面向对象的
10.debug和release的区别?    Debug称为调试版本,它包含调试信息并不做任何优化,便于调试    Release称为发布版本,它进行各种优化,使得程序在代码大小和运行速度上都是     最优的
11.程序的执行过程       预处理—>编译—>汇编—>链接—>执行       1.预处理:(1).宏替换(2).头文件的展开(3).删除注释(4).添加行号文件名等       2.编译: 语法,词法,语义分析产生相应的汇编代码---一般语法错误就在编译时       3.汇编:将汇编代码 转换成计算机可执行的二进制指令       4.链接:导出符号表(??),地址重定向表,未解决的符号表       5.执行:执行程序