- new&delete、malloc&free
都能动态申请内存和释放内存
malloc&free是标准库函数,new&delete是运算符,对于非内部数据类型的对象而言,只有new,delete能自动调用对象的构造函数和析构函数
- 指针和引用
指针指向变量的地址,引用是变量的别名,
引用不占内存单元,指针本身占4字节
引用必须初始化,并在初始化后不能修改,而指针可以不初始化,还可以修改,不存在指向空值的引用,但存在指向空的指针
指针可以有多级int **a,引用只有一级
- 一般变量,指针,引用做函数参数的区别
一般变量和指针作为形参都要单独分配内存空间,引用是直接对实参进行操作
引用和指针都能改变实参
- c++性质
(静态多态)编译时多态:函数模板和函数重载
(动态多态)运行时多态:虚函数:允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数
纯虚函数就是虚函数=0,含有纯虚函数的类被称为抽象类,必须要在子类中实现
两者不能被static修饰,因为它们需要动态绑定
继承:重用代码,子类可以使用父类的功能
封装:提供接口,隐藏实现细节
- const位置,const和define
常变量: const int a = int const a
常引用: const int &a = int const &a
常对象: A const a = const A a
常成员函数: 类名::fun(形参) const
常数组: int const array[大小] = const int array[]
常指针: const int* a 常量指针,不能修改它所指向的内容,int* const a指针常量,不能指向其他的内存模块 (看const和*位置)
- 内存分配
栈:编译器自动分配释放 ,有局部变量,函数参数,不会产生碎片,向着内存地址减少的方向增长
堆:程序员手动分配,通过new申请,delete、delete[]释放,会产生碎片,向着内存地址增加的方向增长
全局/静态存储区:全局变量和静态变量
常量存储区:常量
代码区:二进制代码
- sizeof 和strlen
sizeof:只计算数据成员大小,不计算static成员
struct{
int a;
short b;
char c;
inr *d;
} 4+2+1+(1)+4=12 原因:补齐长度,与下一个所占空间大小成倍数关系
strlen:返回字符串长度 不包括‘\0’
- 内联函数
内联函数使用时=直接将整个函数体的代码插人调用语句处,提高代码可重用性,但增加了代码体积
- 友元
友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类
分友元函数和友元类
- 构造函数和析构函数调用顺序
构造函数:父类->类成员->基类
析构函数:基类->类成员->父类
- 从源代码到可执行文件的过程
预编译-》汇编-》编译-》链接
- include<>和" "的区别
<>从标准库中开始查找
“”从用户指定路径开始查找
- extend C的作用
为了能够正确实现C++代码调用其他C语言代码
- 模板template
- 智能指针
auto_ptr:方便管理单个堆对象的内存(最好不要用)
unique_ptr:方便管理堆对象或者堆对象数组的内存
shared_ptr:方便管理需要共享所有权的内存
weak_ptr:weak_ptr是shared_ptr的观察者,负责从shared_ptr产生一个weak_ptr但是不会增加引用计数,当shread_ptr失效以后,weak_ptr也会失效
- C++11特性
1)关键字 auto nullptr
2)lambda表达式
STL array 单向列表slist 哈希map,set
增加了多线程编程pthread
智能指针
function(函数包装器,可以放下一切可调用之物) bind(函数适配器,改变函数的接口)
- 关键字:
static :①静态全局变量,存储在静态数据区内,作用于为本文件内,及时被extern修饰也不能
②修饰类的成员函数和成员变量时:属于整个类,不属于对象,为各个对象所共享
类外存储,只能在类外初始化
静态成员函数只能访问静态成员变量,没有this指针
auto :必须初始化,系统会根据初始化的变量类型自动确定该变量的数据类型
register
vilotile 易变的意思,主要用于多线程中,读取该变量当前最新值,不需要编译器做优化处理
- 运算符重载