C++11新标准

1. 新类型

long long和unsigned long long;

char16_t 和 char32_t;

新增原始字符串;

2. 统一的初始化

C++11扩大了用大括号括起的列表(初始化列表)的适用范围,使其可以用于所有内置类型和用户定义的类型(即类对象)。

使用初始化列表时,可添加 “=”,也可不添加。

int x = { 5 } ;

double y = { 2.75 } ;

short quar [ 5 ]  { 4 , 5 , 2 , 76 , 1 } ;

另外,列表初始化语法也可用于new表达式中:

int * ar = new int [ 4 ]  { 2 , 4 , 6 , 7 } ; // C++11

创建对象时,也可使用大括号(而不是圆括号)括起的列表来调用构造函数:

class Stump {

  private:

    int roots ;

    double weight ;

  pubilc:

    Stump ( int r , double w ) : roots ( r ) , weight ( w ) { }

} ;

Stump s1 { 3 , 15.6 } ; // oid style

Stump s2 { 5 , 43.4 } ; // C++11

Stump s3 { 4 , 32.1 } ; // C++11

然而,如果类有将模板 std::initializer_list 作为参数的构造函数,则只有该构造函数可以使用列表初始化形式。

1. 缩窄

2. std::initializer_list

C++11提供了模板类initializer_list,可将其用作构造函数的参数。

如果类有接受initializer_list作为参数的构造函数,则初始化列表语法就只能用于该构造函数。列表中的元素必须是同一类型或可转换为同一类型。

3. 声明

3.1 auto

C++11将auto用于实现自动类型判断。这要求进行显示初始化,让编译器能够将变量的类型设置为初始值的类型。

auto maton = 112 ; // maton is type int

auto pt = &maton ; // pt id type int *

double fm ( double , int ) ;

auto pf = fm ; // pf is type double (*) (double , int )

关键字auto还可简化模板声明。

例:
如果 il 是一个std::initializer_list<double>对象,则可将下述代码:

for ( std :: initializer_list < double > :: iterator p = il.begin() ; p != il.end() ; p++ )

替换为如下代码:
for ( auto p = il.begin() ; p != il.end() ; p ++ )

3.2 decltype

关键字decltype将变量的类型声明为表达式指定的类型。

e.g.

int j = n ;

double x ;

decltype ( x*n ) q ; // q same type as x*n , i.e. , double

decltype ( &x ) pd ; // pd same type as &x , i.e. , double *

3.3 返回类型后置

doubel f1 ( double , int ) ; // traditi0nal syntax

auto f2 ( double , int ) -> double ; // new syntax , return type is double

可以配合3.2的decltype来指定模板函数的返回类型。

template < typename T , typename U >

auto eff ( T t , U u ) -> decltype ( T*U ) { }

3.4 模板别名:using =

typedef std :: vector < std :: string > :: iterator itType ; // old

using itType = std :: vector < std :: string > :: iterator ;

using 可以用于模板具体化, 但typedef不能。

3.5 nullptr指针

空指针

4. 智能指针

如果在程序中使用new从堆(自由存储区)分配内存,等到不再需要时,应使用delete将其释放。

C++引入了智能指针auto_ptr,以帮助自动完成这个过程。

C++11摒弃了auto_ptr并新增了unique_ptr,shared_ptr和weak_ptr。

5. 异常规范方面的修改

添加关键字noexcept

6. 作用域内枚举

7.对类的修改

允许构造函数被继承和彼此调用。

7.1 显示转换运算符

8. 模板和STL方面的修改

8.1 基于范围的for循环

double  prices [ 5 ] = { 4.99 , 10.99 , 6.87 , 7.99 , 8.49 } ;

for ( double x : prices )

  std :: cout << x << std :: endl ;

8.2 新的STL容器

forward_lsit // 单向链表

unordered_map

unordered_multimap

unordered_set

unordered_multiset

8.3 新的STL方法

cbegin ( ) 和 cend ( )

8.4 valarray升级

8.5 摒弃export

8.6 尖括号

C++11不在要求在声明嵌套模板时使用空格将尖括号分开

9. 右值引用

原文地址:https://www.cnblogs.com/Kiven5197/p/8836126.html

时间: 2024-11-02 08:17:17

C++11新标准的相关文章

关注C++细节——C++11新标准之decltype的使用注意

c++11新特性--decltype decltype是C++11添加的一个新的关键字,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值. 对于内置类型的对象,使用decltype很直观,但当参数为复合类型的时候就应该注意一些使用细节问题. 1.当decltype作用于数组的时候就应该小心了,本文作者(CSDN   iaccepted). intiarr[10] = {0}; decltype(iarr)ib; 这个时候ib的定义等价于

C++11新标准:nullptr关键字

一.nullptr的意义 1.NULL在C中的定义 #define NULL (void*)0 2.NULL在C++中的定义 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif 3.为什么C++和C中NULL定义不一样呢? void foo(int a) { cout<<"This is int"<<endl; } void foo

C++11新标准:decltype关键字

一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值. 二.decltype用法 1.基本用法 int getSize(); int main(void) { int tempA = 2; /*1.dclTempA为int*/ declty

C++11新标准:auto关键字

一.auto意义 编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型,然后要做到这一点并非那么容易.为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型. 二.auto用法 1.基本用法 int tempA = 1; int tempB = 2; /*1.正常推断auto为int,编译通过*/ auto autoTempA = tempA + tempB; /*2.正常推断auto为int,编译通过*/ auto

基于c++11新标准开发一个支持多线程高并发的网络库

背景 新的c++11标准出后,c++语法得到了很多的扩展,比起以往任何时候都要灵活和高效,提高了程序编码的效率,为软件开发人员节省了不少的时间. 之前我也写过基于ACE的网络服务器框架,但ACE毕竟有些臃肿,内部对象关系错综复杂,容易给人造成只见树木不见森林的错觉. 所以打算用c++11开发一个较为简洁,高效,支持高并发的网络库. 开源         花了两三周,终于把基础的结构开发完成,代码也开源在github上,网址是 https://github.com/lichuan/fly 欢迎各位

Qt支持C++11新标准

当已经升级了g++编辑器后,在Qt Creator的.pro文件里添加 CONFIG += console c++11后执行qMake即可支持:

[C++11新特性]第二篇

0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(int count, ...) { va_list ap; double sum=0; va_start(ap,count); for(int i=0;i<count;i++) sum+=va_arg(ap,double); va_end(ap); return sum; } int main() { p

C++培训 C++11新特性:杂项

C++培训之前小编给大家总结了一些C++的新特性,这一篇文章是介绍的C++11新特性之杂项,在后面的文章中,小编还会给大家总结一些C++11新特性的知识出来! 类型别名声明 类似typedef,新标准中可以使用using为类型声明一个别名(alias). std::cout<<"test using alias:\n"; using HT = double; using NAME = std::string; HT h = 1.78; NAME name = "R

C++11新特性:右值引用和转移构造函数

问题背景 [cpp] view plaincopy #include <iostream> using namespace std; vector<int> doubleValues (const vector<int>& v) { vector<int> new_values( v.size() ); for (auto itr = new_values.begin(), end_itr = new_values.end(); itr != end