兼容c
|
|
引用
引用只能传是已经分配内存的变量,而指针可以传空指针。
|
|
类
浅拷贝深拷贝
像以下这样的代码默认会进行一次浅拷贝,浅拷贝只会把值复制一份,对于指针也是把原来的内存地址复制了一遍并不会开拓新的内存空间。
|
|
而需要把指针也拷贝一份需要重写默认的拷贝函数
|
|
析构函数
析构函数在对象消亡时即自动被调用。可以定义析构函数在对象消亡前做善后工作。
|
|
常量函数
函数后写上const,表示不会也不允许修改类中的成员。
|
|
友元
友元函数
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
|
|
友元类
若一个类愿意将自身的所有成员属性和函数(包含私密的)分享给另一个类可使用友元类
|
|
静态类静态函数
|
|
重载
函数重载
|
|
操作符重载
C++允许重定义或重载大部分 C++ 内置的运算符
函数名是由关键字 operator 和其后要重载的运算符符号构成的
重载运算符可被定义为普通的非成员函数或者被定义为类成员函数 、
例子
|
|
允许重载的运算符
继承
|
|
虚函数
虚函数 防止子类向上转型动态指向父类的函数 析构函数一般要定义为虚函数
|
|
纯虚函数
纯虚函数 类似java的抽象方法 声明函数
|
|
模板
模板是泛型编程的基础
函数模板
函数模板能够用来创建一个通用的函数。以支持多种不同的形參。避免重载函数的函数体反复设计。
|
|
类模板(泛型类)
为类定义一种模式。使得类中的某些数据成员、默写成员函数的參数、某些成员函数的返回值,能够取随意类型
常见的 容器比如 向量 vector
或 vector 就是模板类
|
|
类型转换
除了能使用c语言的强制类型转换外,还有:转换操作符 (新式转换)
const_cast
修改类型的const或volatile属性
|
|
static_cast
- 基础类型之间互转。如:float转成int、int转成unsigned int等
- 指针与void之间互转。如:float*转成void*、Bean*转成void*、函数指针转成void*等
- 子类指针/引用与 父类指针/引用 转换。
|
|
dynamic_cast
主要 将基类指针、引用 安全地转为派生类.
在运行期对可疑的转型操作进行安全检查,仅对多态有效
|
|
reinterpret_cast
对指针、引用进行原始转换
|
|
char*与int转换
|
|
异常
|
|
文件与流操作
C 语言的文件读写操作
头文件:stdio.h
函数原型:FILE fopen(const char path, const char * mode);
path: 操作的文件路径
mode:模式
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
r+ | 打开一个文本文件,允许读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
|
|
C++ 文件读写操作
\
和 \
数据类型 | 描述 |
---|---|
ofstream | 输出文件流,创建文件并向文件写入信息。 |
ifstream | 输入文件流,从文件读取信息。 |
fstream | 文件流,且同时具有 ofstream 和 ifstream 两种功能。 |
|
|
线程
C++11线程
|
|
POSIX线程
POSIX 可移植操作系统接口,标准定义了操作系统应该为应用程序提供的接口标准
创建线程
方法 | 说明 |
---|---|
int pthread_create(pthread_t __ pthread_ptr, pthread_attr_t const attr, void (start_routine)(void), void ); | 创建线程 第一个参数为线程id,第二个参数为线程属性,第三个参数为线程要运行的函数指针,第四个参数为传给运行的函数的 参数的地址 |
例子
|
|
线程属性
|
|
分离线程
线程创建默认是非分离的,当pthread_join()函数返回时,创建的线程终止,释放自己占用的系统资源
分离线程不能被其他线程等待,pthread_join无效。
|
|
调度策略与优先级
|
|
线程同步
方法 | 说明 |
---|---|
pthread_mutex_t | 互斥锁的对象 |
pthread_mutex_init(pthread_mutex_t __ mutex, const pthread_mutexattr_t __attr); | 初始化互斥锁 第一个参数互斥锁的对象 第二个是互斥锁属性 NULL值为默认属性 |
pthread_mutex_destroy(pthread_mutex_t* __mutex) | 消除一个互斥锁 |
pthread_mutex_lock(pthread_mutex_t* __mutex) | 加锁(阻塞操作 如果这个锁此时正在被其它线程占用, 那么 pthread_mutex_lock() 调用会进入到这个锁的排队队列中,并会进入阻塞状态, 直到拿到锁之后才会返回) |
pthread_mutex_trylock(pthread_mutex_t* __mutex) | 加锁(非阻塞操作 如果锁被占用咱就不用,如果没被占用那就用) |
pthread_mutex_unlock(pthread_mutex_t* __mutex) | 释放锁 |
非堵塞
|
|
|
|
条件变量
条件变量是线程同步的一种手段。条件变量用来自动阻塞一个线程,直到条件(predicate)满足被触发为止。通常情况下条件变量和互斥锁同时使用。
方法 | 说明 |
---|---|
pthread_cond_t | 条件变量对象 |
pthread_cond_init(pthread_cond_t __ cond, const pthread_condattr_t __attr) | 初始化条件变量 第二个参数为NULL,则使用默认条件变量属性 |
pthread_cond_wait(pthread_cond_t __ cond, pthread_mutex_t __mutex) | 阻塞 第一个参数为条件变量 第二个参数为互斥锁 |
pthread_cond_signal(pthread_cond_t* __cond) | 解除阻塞 由系统通知唤醒一个线程 |
pthread_cond_broadcast(pthread_cond_t *cond) | 解除阻塞 广播通知所有等待线程(推荐用这个) |
pthread_cond_destroy(pthread_cond_t* __cond) | 销毁条件变量 |
|
|
|
|
智能指针
shared_ptr
操作引用计数实现共享式拥有的概念。多个智能指针可以指向相同的对象,这个对象和其相关资源会在最后一个被销毁时释放。
|
|
虽然使用shared_ptr能够非常方便的为我们自动释放对象,但是还是会出现一些问题。最典型的就是循环引用问题。
|
|
weak_ptr
weak_ptr是为配合shared_ptr而引入的一种智能指针。主要用于观测资源的引用情况。
它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象。
配合shared_ptr解决循环引用问题
|
|
weak_ptr 提供expired 方法等价于 use_count == 0,当expired为true时,lock返回一个存储空指针的shared_ptr
unique_ptr
实现独占式引用,保证同一时间只有一个智能指针指向内部对象。
|
|
auto_ptr已经不推荐使用
部分C++11、14特性
nullptr
nullptr 出现的目的是为了替代 NULL。 C++11之前直接将NULL定义为 0。
|
|
类型推导
C++11 重新定义了auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。
|
|
基于范围的 for 循环
实际上就是foreach
|
|
Lambda
匿名函数,即没有函数名的函数
完整形式:
[捕获外部变量列表 ] (参数列表) mutable exception->返回类型 { 函数体 }
mutable:在外部变量列表以值来捕获时,无法修改变量的值,加上mutable表示可修改(不会影响外部变量)
|
|
捕获形式 | 说明 |
---|---|
[] | 不捕获任何外部变量 |
[i, …] | 以值得形式捕获指定的多个外部变量(用逗号分隔);如果引用捕获,需要显示声明& |
[this] | 以值的形式捕获this指针 |
[=] | 以值的形式捕获所有外部变量 |
[&] | 以引用形式捕获所有外部变量 |
[=, &x] | 变量x以引用形式捕获,其余变量以传值形式捕获 |
[&, x] | 变量x以值的形式捕获,其余变量以引用形式捕获 |