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.执行:执行程序