概述
最近因为工作需要(搞3D渲染引擎开发)重温了C++11的特性!
C++11的新特性:
(一)变量与基本类型:
1.
long long类 10位有效数字;
2.
列表初始化 使用花括号的初始化变量称为初始化列表 int i =0;int i ={0};int i{0};int i(0);
3. nullptr变量 有几种空指针的方法:
int *p1 = nullptr; //等价于Int*p1 =0;
int *p2 = 0;
int *p3 = Null; //等价于int *p3 = 0;
建议尽量使用新标准nullptr,nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型,虽然其它的方式也是可以的;
4.constexpr变量
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
5.类型别名声明
使用类型别名可以使复杂的类型名字变得更简单明了,易于理解和使用,一种使用typedef,另一种则是新标准 的using;
6.auto类型指示符:
auto是让编译器通过初始化来推算变量的类型,所以定义的变量必须要有初始值;
-
顶层const:指针本身是一个变量;
-
底层const :指针指向的对象是一个常量;
7.类内初始化。
建议初始化每一个内置类型的变量,为了保证初始化后程序安全。
8.定义 Vector对象的vector(向量的向量)
编译器根据模板vector生成了三种不同的类型,分别是:
vector,vector <vector>,vector
9.容器中的cbegin和cend函数
10.lambda表达式:
一个lambda具有一个返回类型、一个参数列表和一个函数体;
11.右值引用
右值引用就是必须绑定到右值的引用,通过 && 来获得右值引用,区别左值和右值 -
左值:在赋值号左边,可以被赋值的值,可以取地址;
-
右值:在赋值号右边,取出值赋给其他变量的值;
-
左值引用:type &引用名 = 左值表达式
-
右值引用:type && 引用名 = 右值表达式
(二)类:
1.使用=default生成默认的构造函数
如果实现了默认的构造函数,编译器则不会自动生成默认版本;可以通过使用关键字 default 来控制默认构造函数的生成,显示的指示编译器生成该函数的默认版本;
比如说如果想要禁止使用拷贝构造函数,则使用关键字 delete;
class MyClass
{
public:
MyClass()=default;
MyClass(const MyClass& )=delete;
};
但需要注意的是,析构函数是不允许使用delete的,否则无法删除;
(三)容器:
vector
可变大小数组。支持快速随机访问。在尾部之外的位置插入或者删除元素时可能很慢
deque
双端队列。支持快速随机访问。在头尾位置插入/删除速度很快
list
双向链表。只支持双向双向顺序访问。在list中任何位置进行插入/删除操作
forward_list
单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作都很快
array
固定大小数组。支持快速随即访问。不能添加或删除元素
string
与vector相似的容器,但专门用于保存字符(字符数组,封装了char而已)。随机访问速度快,在尾部插入、删除速度快
string类型的数值转换:
新标准中,引入多个函数实现数值数据和标准库string之间的转换:
函数
描述
to_string(val)
返回任意算术类型val的字符串
stoi(s, p, b)
int类型
stol(s, p, b)
long类型
stoul(s, p, b)
unsigned long类型
stoll(s, p, b)
long long类型
stoull(s, p, b)
unsigned long long类型
stof(s, p, b)
float类型
stod(s, p, b)
double类型
stold(s, p, b)
long double类型(四)面向对象程序设计
1.虚函数的override和final指示符
override可以帮助程序员的意图更加清晰,其职能用于覆盖基类的虚函数;final使得任何尝试覆盖该函数的操作都引发error;
2 删除的拷贝控制和继承
如果函数在基类中被定义为是删除的,则派生类对应的也是删除的;
3. 继承的构造函数:委派和继承构造函数是由C++11引进为了减少构造函数重复代码而开发的两种不同的特性;
a. 通过特殊的初始化列表语法,委派构造函数允许类的一个构造函数调用其它的构造函数
X::X(const string& name) : name_(name) {}
X::X() : X("") { }
b. 继承构造函数允许派生类直接调用基类的构造函数,一如继承基类的其它成员函数,而无需重新声明,当基类拥有多个构造函数时这一功能尤其有用:
class Base {
public:
Base();
Base(int n);
Base(const string& s);
};
class Derived : public Base {
public:
using Base::Base; // Base's constructors are redeclared here.
};
4.实例化的显示控制
显示实例化:在不发生函数调用的时候将函数模版实例化或者在不适用类模版的时候将类模版实例化,这可以避免实例化相同的模版所带来的额外开销;
*
函数模版实例化
- template函数返回类型 函数模板名<实际类型列表>(函数参数列表)
类模版实例化
- template class 类模板名<实际类型列表>
最后
以上就是结实斑马为你收集整理的C++11新特性的全部内容,希望文章能够帮你解决C++11新特性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复