1. C++的新特性
1.1 新增long long类型
long类型通常表示一个32位整型
新增long long类型用于表示一个64位整型
注:
(1)C++标准定义中,特别注明long long类型表示的是至少为64位的整数类型
(2)C++又为long long类型添加两个字面量后缀,分别是LL(表示有符号)和ULL(表示无符号)
例如:
long long a=-156656464 LL //表示有符号
long long a=1566449494 ULL //表示无符号
1.2 新增列表初始化
符号:{}
在C++98标准中,符号{}用于初始化数组、结构体等等;在C++11中,列表初始化不仅能应用于内置类型变量(数组、结构体等)还能用于自定义类型变量(例如类类型),也可以用于在new开辟的空间时,传递构造函数实参
例如:
初始化基本数据类型:
int a={1};
int a{1} ; //这种直接省略符号“=”
初始化自定义类类型:
People people={1,2};
1.3 nullptr常量
在程序开发中,一般在定义指针的同时会完成初始化操作(防止出现野指针的情况),所以在指针的指向不明确的时候,都会将指针初始化为空指针
在C++98中:
int * a= 0; //以下两种都可以实现将指针赋为空
int *a=NULL
底层代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
//以上可以看到NULL可能被定义为常量0,也可能被定义为无类型指针(void *)0,会出现二义性问题
在C++11中:
定义了nullptr表示指针空值常量
定义了nullptr_t表示指针空值类型
1.4 范围for语句
格式:
for(element:range)
{
}
其中element是一个变量,range是一个序列,范围for循环会遍历range中的每一个元素,并将其赋值给element(如果需要对range进行写操作,则必须将element声明为引用),然后在执行循环体的代码
例如:
int arr[5]={1,2,3,4,5};
for(int &a : arr)
{
a*=2; //将arr中每一个元素进行乘以2操作
}
或
int arr[5]={1,2,3,4,5};
int sum=0;
for(int a : arr)
{
sum+=a;
}
1.5 使用auto类型
C++11新增auto类型可以实现
(1)在声明变量时根据初始化列表表达式自动推导该变量的类型
(2)声明函数时,可以自动推导函数的返回值类型
1.5.1注:
使用auto时,不能解决所有的精度问题
使用auto时,不能与其他类型组合使用,例如:auto int a//是错误的
使用auto时,必须对变量进行初始化
1.6 将sizeof用于类成员
例如:
#include"iostream"
using namespace std;
class People
{
public:
int a = 10;
char buf[20];
};
int main()
{
People people;
cout << sizeof(people) << endl;//sizeof(people);//用于计算类中的成员变量,不算函数
return 0;
}
1.7 lambda表达式
lambda表达式,也称为匿名函数
语法原型:
[capture-list] (parameters) opt -> return_type {statement}
(1)[capture-list]
它是捕获列表,不能省略,如果捕获,则表示为[]
常见的捕获列表:
[]:
表示不捕获
[&]:
表示按引用捕获
[=]:
表示按值捕获所有父作用域内的局部变量
[this]:
捕获当前类中的this指针,表示lambda表达式也拥有当前类成员的权限
(2)(parameters)
它是Lambda表达式参数列表,类似于函数的参数列表一样
如果无参:则表示为()
如果有参:则表示为(int a , int b,....)
(3)opt
可选项,一般省略
(4)return_type
Lambda表达式返回值类型,可以省略,也可以不省略
如果省略,则由return语句的返回值类型确定
如果不省略,则可以加数据类型作为返回值即可
(5){statement}
表示Lambda表达式函数体,类似于函数体,即可以在这里面实现相关功能
(6)Lambda表达式的调用
原型:
返回值类型 标识符 = Lambda表达式;
标识符(实参1,实参2,.....)//调用Lambda表达式
例如:
int func=[](int a , int b){
return a+b;
}
func(10 , 20); //调用Lambda表达式
1.8 explicit类型转换运算符
通过explicit将表达式声明为类型的显式转换,不能实现隐式转换
1.9 虚函数的override指示符
如果虚函数用override关键字进行声明,表示该函数是重写了基类的同名虚函数
例如:
父类:
class Father
{
public:
virtual void function();
}
class Son :public Father
{
public:
virtual void function()override; //表示该虚函数是重写了父类的虚函数function函数
}
1.10 通过定义类或虚函数为final来阻止继承
使用关键字final修饰来,表示该类禁止被继承
例如:
类:
class Father final
{
}
class Son :public Father //报错,因为Father禁止被继承
{
}
虚函数:
class Father
{
public:
virtual void function()final
{
}
}
class Son :public Father
{
public:
virtual void function()//报错,function函数禁止被继承到子类
{
}
}