C++ 特性
编译过程:
CPP 预处理 .I
.I 编译 .s (优化)
.s 汇编 .o
.o 链接 可执行文件
强制类型转化
隐式转化:相似类型间的转换
显示类型转化: 不相似类型转化 如指针与整形
- static_cast : 用于非多态类型转化:标准转化可以使用,但是不相关类型不可以转化(静态交换)
- reinterpret_cast : 将一种类型转化为另一种类型
- const_cast :删除变量的常量属性,方便赋值
- dynamic_cast:用于将一个父类对象的指针转换为子类对象的指针或引用(动态交换)
//1. static_cast
int i = 10;
double b = static_cast<double>(i);
//2. reinterpret_cast
int i = 10;
int * p = reinterpret_cast<int *>(i);
//3. const_cast
string s;
char str[20];
strcpy(str,s.c_str);
const char a = "a";
char * p = const_cast<char *>(&a)
// 4. dynamic_cast:
// 会检查能否转成功不成返回0 用于 父 ——> 子 必须公有继承和虚函数
特殊关键字
- inline 向编译器建议以内联函数处理
- const 不能修改的变量 在初始化列表中初始化
- mutable 被声明的变量可以被常函数修改
- static 声明静态成员,包括静态数据成员和静态成员函数,被类的所有对象共享,静态数据成员必须初始化才可以使用,静态成员函数只能访问静态成员,不能访问非静态成员因为该函数没有空指针
- virtual 声明虚函数,用于实现多态
- friend 友元
- volatile 使其可以在编译器认识的范围外被修改,因此编译器不对其进行优化
- explicit 修饰的构造函数不能在隐式转换中使用
- register 只可以在一块,不可以在全局,告诉编译器尽可能快的访问这个变量
10.extem 告诉编译器存在一个函数或变量可以在提前声明存在
深拷贝浅拷贝
- 浅拷贝两个变量公用一个实例
- 复制两个对象
nullptr
为了代替NULL 专门用来区分空指针和0
auto
auto 让编译器通过初始值来推算变量的类型,当然,其定义的变量必须要有初始值
decltype(变量)可以获取变量的类型
常用语迭代器
auto itr = vec.cbegin()
ayto 不能用于函数参数传递 可以考虑使用模板解决
decltype 和sizeof很像
区间迭代
for(auto &i:arr)
{
}
初始化列表
按照数据定义顺序进行初始化
C++11 把其绑定在类型上 std::initializer_list
模板
template
类的默认函数
- 默认构造函数
- 默认拷贝构造函数
- 默认析构函数
- 默认重载运算符 =
- 默认重载运算符 &
- 默认重载取地址符const 函数
- 默认移动构造函数(C++11)
- 默认重载移动赋值操作符函数(C++11)
C++ 类与结构体
- C++ 类默认成员是私有的 结构体默认成员是公有的
- C++ 结构体继承默认是公有的 类继承默认是私有的
智能指针
auto_ptr (弃用)
unique_ptr
shared_ptr
weak_ptr
原理:将普通指针封装为栈对象,栈对象在生存周期之后,会在析构函数中释放掉内存,从而防止内存泄露
share_ptr 采用引用计数的方式管理对象,当引用计数为零的时候才释放空间,普通指针不可以直接赋值给智能指针,一个是类一个指针,可以使用 make_shared
- auto_ptr
auto_ptr<string> p1 (new string("test"));
auto_ptr<string> p2;
p2 = p1;
// p1 失效
- unique_ptr 独占指针
所有权不可以转换,一个对象同一时间只能有一个指针指向
unique_ptr<string> p1 (new string("test"));
unique_ptr<string> p2;
p2 = p1; // 报错 需要用move 移动
- shere_ptr 共享指针 引用计数指针 针对指向同一个对象的指针数计数
- weak_ptr 用于指向shere_ptr 指向的对象 是对象的访问手段
weak_ptr 可以解决 share_ptr 死锁问题 weak 可以通过.lock()转化为shere_ptr