前言

本文主要介绍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的一些函数的简单介绍。

更多推荐