最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
C++继承了C语言的高效、简洁、快速和可以执行,同时融合了三种不同的编程方式:
C语言代表的过程性语言
在C语言基础上添加的类代表的面向对象语言
C++模板支持的泛型编程
C是面向过程,C++是面向对象
C++添加了类
C++有引用的概念,C没有
C变量只能在函数的开头处声明和定义,而C++随时定义随时使用
使用
其他
new运算符内部数据类型不进行初始化,会自动调用非内部数据类型的默认构造函数
由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free
new/delete 是关键词;malloc/free是库函数
new/delete会调用对象构造/析构函数
对于内建简单数据类型,delete和delete[] 相同
对于复杂数据类型,delete[]删除一个数组
构造对象时,先调用父类构造函数,再调用派生类构造函数
析构对象时,先调用派生类析构函数,再调用基类构造函数
定义只读变量,即常量
修饰函数的参数和函数的返回值
修饰函数的定义体,这里的函数为类的成员函数,被const修饰的成员函数代表不修改成员变量的值
引用是变量的一个别名,内部实现是只读指针,仍然占用栈空间,但是地址和被引用的变量一致,这说明编译器隐藏了引用变量的地址
有多级指针,但没有多级引用
引用只能在初始化时被赋值,其他时候值不能被改变,非const指针的值可以在任何时候被改变
引用不能直接赋值为NULL,指针可以
引用变量内存单元保存的是被引用变量的地址
"sizeof 引用" = 指向变量的大小 , "sizeof 指针"= 指针本身的大小
指针可以指向栈和堆空间,但是指引用地址只能是栈
指针可以使用++或+n遍历数组
指针拥有一个内存地址,引用的内存地址和被引用变量一致
const引用可以绑定临时变量,但是指针不可以
#include <...>
: 首先搜索默认路径,如果不存在,再去搜索源文件所在目录
#include "..."
: 首先搜索源文件所在目录,如果不存在,再去搜索默认路径
PS
默认路径 : 系统及LD_LIBRARY_PATH
定义路径
共享库/动态库(Shared libraries / Dynamic libraries)
.so
or .dll
in windows or .dylib
in OS X
在程序运行时使用它
使用共享库的程序仅引用使用到的代码
优点
编译的程序较小
可以在不重新编译程序的前提下,更新动态库
缺点
增加运行时开销
静态库(Static libraries)
.a
or .lib
in windows
在编译时直接链接到程序中
使用静态库的程序从静态库中获取它使用的代码的副本,并使其成为程序的一部分
打包动态库/静态库
Ref
修饰全局
程序运行分配内存,生命周期和程序一样
const : 不可更改
static : 静态常量
const static : 不可变的静态变量
不仅只是int,整数类型都可以
char
long
...
使用C/C++的人,都该有这么一个共识:对资源谁申请谁释放,否则就必须使用委托。当资源仅在某一个函数里使用时,那就必须在该函数里释放。
在C++中通常使用RAII,即Resource Aquisition Is Initialization。就是将资源封装成一个类,将资源的初始化封装在构造函数里,释放封装在析构函数里。要在局部使用资源的时候,就实例化一个local object。在抛出异常的时候,由于local object脱离了作用域,自动调用析构函数,会保证资源被释放。
项目
new/delete
malloc/free
属性
C++关键字/操作符,需要编译器支持
库函数,需要头文件支持
参数
无须指定内存块的大小,编译器会根据类型信息自行计算
需要显式地指出所需内存的尺寸
返回类型
返回对象类型的指针,无需转换
返回void*指针,需要强转
分配失败
抛出bas_alloc异常
返回NULL