std::move
左值、右值、引用
tip
include里面声明的变量是可以,直接在.cc文件中直接使用的。
abs()函数主要是对int求绝对值
fabs()对float,double求绝对值
struct 初始化
a{}结构体a被初始化,各个成员都将被设置为0
二、char转int
char转int之前,先将运算式中的每个字符都转换成ASCII码值,再进行计算。
以下代码为例,其中i3的结果符合我们的预期要求。
char c = '0';
int i1 = c; // 48
int i2 = c - 0; // 48
int i3 = c - '0'; // 0
int i4 = c + '0'; // 96
三、int转char
int转char之前,先将运算式中的每个字符都转换成ASCII码值,再进行计算。
计算出数值后,再据此转换为字符(数值为该字符对应的ASCII码值)。
以下代码为例,其中c3的结果符合我们的预期要求。
int i = 5;
char c1 = i; // 越界
char c2 = i - 0; // 越界
char c3 = i - '0'; // 越界
char c4 = i + '0'; // 5
make_shared 是最安全的分配和使用动态内存的方法,它会在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr,在memory头文件
void *
lambda与bind
enum class
限制作用域枚举类型
枚举成员的名字遵循常规的作用域准则,并且在枚举类型的作用域外是不可以访问的
eg
enum class peppers {red,yellow,green};
peppers p1=red; //error 枚举成员不在有效作用域内
peppers p1=peppers::red; //sucess
枚举成员是const的,所以初始化枚举成员的时的初始值必须是常量表达式。
enum class xxx:long
如果没有显示声明,默认为int
并且,限定作用域的枚举类型不像不限定作用域枚举类型那样可以自动转化成整型。
类型转换
转换后其实就详单与整容,但人还是他自己
static 只执行一次,可以覆盖;
static JackUpData* get() {
static JackUpData instance; //只执行一次。
return &instance;
}
这样单例子就是全局的了
#include"iostream"
int main()
{
for(int i=0;i<7;i++)
{
static int a=1;
std::cout<<a<<std::endl;
a++;
}
}
结果
1
2
3
4
5
6
7
const 只读
std::function
std::function是通用的多态函数封装器,它的实例可以存储、复制以及调用任何可以调用的目标:函数,lambda表达式/bind表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针;
就是一个模板
std::function<int(int,int)> f
表示一个接受两个int返回int的函数对象
Subscribe(
int channel, int device_id,
std::function<void(const VCI_CAN_OBJ)> data_callback)
分析一下,这是个接收两个int 和一个接收VCI_CAN_OBJ的函数对象类型;
**data_callback是一个用来储存可调用对象的空function,可调用对象的形式为void(const VCI_CAN_OBJ)**
所以我们调用的时候可以传,函数指针,lambda表达式,bind函数和函数对象类的对象。
Subscribe(
channel_, feedback_id_,
std::bind(&CurtisDriver::HandleFeedbackMsg, this, std::placeholders::_1));
注意:返回的是可调用对形象
std::function<int(int,int)> f1=add //函数指针
std::function<int(int,int)> f2=devide() //重载()运算符的类对象
std::function<int(int,int)> f1=[](int i,int j){return i*j;} //lamda表达式
std::function<int(int,int)> f1=bind(add) //bind