C++新特性

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函数禁止被继承到子类
    {
    }
}

你可能感兴趣的:(C++,c++,算法,c语言,linux)