C++11第二部分:C++11的简单介绍
前言
本文主要介绍C++11的一些重要成员:范围for循环;final与override静态数组array,forward_list,和unordered系列的容器,默认成员函数控制;
一、范围for循环
什么是范围for循环?-》是一种类似迭代器的一种写法,他能够遍历某个容器中的内容,一般在STL容器中,或者数组中使用范围for循环,
int a=[1,2,3,4,5,6];
for(auto e:a)
{
cout<<e<<"";
}
cout <<endl;
范围for一般进行于遍历容器中使用,相对还是比较常用和好用。
二、final与override关键字
1.final
final可以进行修饰类,使类变成最终类,不能被继承
final class A
{
A ()
{
cout<<"A"<<endl;
}
};
class B:public A//错误的,A被final修饰,变成最终类,不能进行继承了;
{
}
final还可以进行修饰虚函数,使虚函数不能被重写;
class A
{
final virtual void test(const int& name)
{
cout<<"hello"<<endl;
}
}
class B:public A
{
void test()//不合法,被final修饰的虚函数不能进行重写
{
cout<<"hello world"<<endl;
}
}
不合法了;详细去看我C++多态的那篇文章
2.override
override是进行检查虚函数是否被子类进行重写,不满足的话,就会报错,相当于为我们检查了,
class A
{
override void test(const int& name)
{
cout<<"student"<<endl;
}
}
三、静态数组array、forward_list,和unordered容器
C++11的新容器,array定长数组;缺点:定长+存储数据的空间在栈上,栈的空间本来就不大。而且实际应用中定长数组会比较影响;所以实际很少用。但是array支持了at(),和push_back等成员函数,进行插入删除,比单纯的数组好一些。
forward_list(单链表):缺点:不支持尾删尾插,insert数据也是在当前位置的后面;
unordered_map/set推荐使用,效率较高;
四、默认成员函数控制
在C++中对于空类编译器会生成一些默认的成员函数,比如:构造函数、拷贝构造函数、运算符重载、析构函数和&和const&的重载、移动构造、移动拷贝构造等函数。如果在类中显式定义了,编译器将不会重新生成默认版本。有时候这样的规则可能被忘记,最常见的是声明了带参数的构造函数,必要时则需要定义不带参数的版本以实例化无参的对象。而且有时编译器会生成,有时又不生成,容易造成混乱,于是C++11让程序员可以控制是否需要编译器生成;
1.显式缺省函数
在C++11中,可以在默认函数定义或者声明时加上=default,从而显式的指示编译器生成该函数的默认版本,用=default修饰的函数称为显式缺省函数。如
class A
{
public:
A(int a): _a(a)
{}
//显式缺省构造函数,由编译器生成
A() = default;
//在类中声明,在类外定义时让编译器生成默认赋值运算符重载
A& operator=(const A& a);
private:
int _a;
};
A& A::operator=(const A& a) = default;
int main()
{
A a1(10);
A a2;
a2 = a1;
return 0;
}
2.删除默认函数
如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且不给定义,这样只要其他人想要调用就会报错。在C++11中更简单,只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数
class A
{
public:
A(int a): _a(a)
{}
//禁止编译器生成默认的拷贝构造函数以及赋值运算符重载
A(const A&) = delete;
A& operator(const A&) = delete;
private:
int _a;
};
int main()
{
A a1(10);
//编译失败,因为该类没有拷贝构造函数
//A a2(a1);
//编译失败,因为该类没有赋值运算符重载
A a3(20);
a3 = a2;
return 0;
}
注意:避免删除函数和explicit一起使用,.
总结
对C++11的一些函数的简单介绍。
更多推荐

所有评论(0)