本文对C++11的新特性进行讲解,有详细的代码介绍以及用法,帮助你们学习。话不多说,直接开始。
auto & decltype
关于C++11的新特性,最先提到的肯定是自动类型推导,很方便。C++11引入了auto和decltype关键字,使用它们可以让编译器在编译阶段自动推导出变量或者表达式的类型,对于C++开发人员来说简直就是一大福音呀。
- auto:让编译器在编译阶段就推导出变量的类型,可以通过赋值运算符=右边的类型推导出变量的类型。
例如:
auto i = 10; //推导出10为int型,所以auto为int型
- decltype:与auto不同的是decltype用于推导表达式的类型,编译器会分析表达式的类型,但并不会执行表达式。
例如:
const int i = 10;
int a = 1;
decltype(i) b = 2; //decltype推导出i的类型为const int 则b类型也为const int.
右值引用
C++11新增加了右值引用,先讲概念:
右值:没有名字,不能对其进行取址操作,通常用来保存临时变量。
右值引用就是对右值进行引用的类型。右值引用支持完美转发和移动语义。
移动语义:转移资源的所有权。
完美转发:可以写一个接受任意实参的函数模板,并转发到其他函数,目标函数会收到与转发函数相同的实参。
使用右值引用可以减少不必要的拷贝,性能更加优化。
初始化列表
在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化。
例如:
class student
{
public:
student(string name_h,int age_h):name(name_h),age(age_h){}
private:
string name;
int age;
};
int main()
{
student std("xiaoming",18);
student std1 = {"xiaohong",24};
student std2{"xiaohei",21};
}
//也可以使用在返回值
vector<int> func()
{
return {1,2,3};
}
function & bind & lambda表达式
- function函数
function可以看作是一个函数对象,用于对这个函数的抽象概念。function的实例对象可以存储、赋值和调用任何可以调用的对象(函数指针,伪函数,lambda等等);
例如:
int func(int a,int b)
{
return a+b;
}
function<int(int,int)> f = func;
f(1,2);
function<void(int a,int b)> f1 = [](int a,int b){return a+b;};
f1(1,2);
从上面可以看到function的使用方法,当对function填入合适的参数表和返回值后,它就变成了可以容纳所有这一类调用方式的函数封装器,可以作为回调函数。
- bind函数
bind函数可以将可调用对象和参数一起绑定,绑定后的结果可以使用function函数保存。通常与placeholdors占位符一起使用,有两大作用:
- 将可调用对象和参数绑定。
- 可以将n元对象转为m(m<n)元可调用对象。
例如:
void func(int a,int b,int c)
{
cout<<a<<""<<b<<""<<c<<""<<endl;
}
int main()
{
auto func1 = bind(func,placeholdors::_1,1,2);
func1(3); //相当于func(3,1,2);
auto func1 = bind(func,placeholdors::_1,placeholdors::_2,2);
func1(3,2); //相当于func(3,2,2);
auto func1 = bind(func,placeholdors::_1,placeholdors::_2,placeholdors::_3);
func1(3,2,1); //相当于func(3,2,1);
}
- lambda表达式
lambda表达式定义了一个匿名函数,可以捕获一定范围的变量在函数内部使用。
例如:
auto func = [](int a,int b){return a+b;};
[]内可以捕获变量,使用&或者=或者直接输入变量名。
锁机制&多线程
c++11增加了许多并发相关的东西,比如说
- thread相关,多线程
- mutex相关,互斥锁
- lock相关,锁
- atomic相关,原子变量等等
- condition_variable相关,条件变量等等
智能指针
说到c++最让程序员头痛的莫过于内存管理了,经常内存泄漏。c++11引入了智能指针来解决内存泄漏的问题。c++11引入了三种新的智能指针。
- unique_ptr:独享式智能指针,不能复制与赋值,同一时间类只能有一个unique_ptr指向该对象,可以使用move()转移对象的所有权。
- shared_ptr:共享式智能指针,支持复制与赋值,可以多个智能指针指向该对象,只有最后一个指针才会释放资源。使用计数技术来表明有多少个指针共享该资源。
- weak_ptr:它是对对象的弱引用,不会增加对象的引用计数,可以与shared_ptr相互转换,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。
如果shared_ptr指针相互引用的话仍然会造成内存泄漏,可以使用weak_ptr解决。
基于范围的for循环
例如:
int main()
{
vector<int> vec = {1,2,3,4,5,6};
for(auto x:vec)
{
cout<<x<<endl;
}
return 0;
}
nullptr
nullptr是C++11用来表示空指针新引入的常量值,在C++用来表示空指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是int型的0,不是个空指针。
C++11关键字
- final:用于修饰一个类,表示禁止该类进一步派生和虚函数的进一步重载。
- override:用于修饰派生类中的成员函数,表明该函数重写了基类函数。
- default:用于生成默认构造函数。
- delete:禁止生成默认构造函数
- explicit:作用于修饰构造函数,表示只能显示构造,不可以被隐式转换。
class peopel
{
public:
people(){};
people(people &){};
virtual void func(){};
virtual void func1(){};
private:
string name;
int age;
};
class student:public people
{
public:
explicit student() = default;
student(student &)=delete;
virtual void func() override{};
virtual void func1(){};
private:
string name;
int age;
};
int main()
{
studnet std = {"xiaoming",12}; //error,不能隐式转换
studnet std1("xiaohei",13); //OK
return 0;
}
好了,就写这么多吧,相信各位看完后一定会有所收获的。