C++11 带来的新特性 (1)

1 语法改进

1.1 模板表达式中的空格

  • 在c++03 及以前
vector<list<int>>;   //Error
vector<list<int> >;  //OK
  • c++11
vector<list<int>>;   //OK

1.2 nullptr 和 std::nullptr_t

  • 在c++03 及以前
void f(int);
void f(void*);
f(0);  //call f(int)
f(NULL); //有歧义
  • c++11
f(nullptr);//call f(void*)

nullptr是关键词,其类型是std::nullptr_t

2 auto-自动类型推断

auto i = 42;   //int
double f();
auto d = f();  //double
auto n;        //Error
static auto vat = 0.19;

vector<string> v;
auto pos = v.begin();

auto f = [](int x)-> bool{return x+1;}

3 for循环

基本形式:

for( decl : coll ){
    statement
}

等价于:

for( auto _pos = coll.begin(), _end = coll.end(); _pos != NULL; ++_pos){
    decl = * _pos;
    statement
}

或者(其中begin()和end()是全局函数):

for( auto _pos = begin(coll), _end = end(coll); _pos != NULL; ++_pos){
    decl = * _pos;
    statement
}
  • 示例1
for( int i : {2, 3, 4, 5,8} ){
    std::cout<< i << std::endl;
}
  • 示例2。使用引用方式,修改容器中的元素。
std::vector<double> vec;
...
for( auto & elem : vec ){
    elem *= 3;
}
  • 示例3。结合模板,同时使用const修饰元素。
template < typename T>
void printElements( const T& coll ){
    for( const auto& elem : coll ){
        std::cout<< elem << std::endl;
    }
}
  • 示例3。结合模板,同时使用const修饰元素。
template < typename T>
void printElements( const T& coll ){
    for( const auto& elem : coll ){
        std::cout<< elem << std::endl;
    }
}
  • 示例4。range方式使用for循环,会调用拷贝构造函数。
Get() const{
        return m_data;
    }
private:
    int m_data;
};

ostream& operator<<(ostream& os, const X& x)
{
            os << x.Get();
                return os;
}

int main(){
    vector<X> v = {1, 3, 5, 7, 9};
    cout << "\nElements:\n";
    for (auto x : v)
    {
        cout << x << ' ';
    }
    return 0;
}

输出:

X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.

Elements:
X copy ctor.
1 X copy ctor.
3 X copy ctor.
5 X copy ctor.
7 X copy ctor.
9

为了防止调用拷贝构造函数,提高下率,加上引用。

    for (auto &x : v)
    {
        cout << x << ' ';
    }

执行输出:

X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.

Elements:
1 3 5 7 9

发现已经不调用拷贝构造函数了。

  • 反面示例。在for循环中,不能显示调用(使用explicit)类型转换函数:
class C  {
public :
    explicit C( const std::string & s); //显示转换
    ...
};

int main(){
    std::vector<std::string> vs;
    for( const C& elem : vs ){
        std::cout << elem << std::endl;
    }
}

报错。去掉“explicit”后,可正常运行。

invalid initialization of reference of type ‘const C&’ from expression of type ‘std::__cxx11::basic_string<char>’

4 字符串

  • 原始字符串

在字符串前面加上关键字R,表示这是一个原始字符串。
下面这两个是等效的。

    "\\\\n"
    R"\\n"

下面这两个也是等效的。

    R"nc(a         b\nc()"
         )nc";
    "nc(a\\\n         b\\nc()\"\n         )nc";
  • 编码的字符串

使用编码前缀制定字符串编码。如下

    L"hello"    // 定义wchar_t编码的字符串

前缀有以下几种:
- u8表示UTF-8编码。
- u表示char16_t
- U表示char32_t
- L表示宽字符集,类型wchar_t

5 强枚举类型

c++11中的枚举类型如下所示:

enum class Salutation : char { mr, ms, co, none };
  • 与int类型之间显示转换是不允许的。
  • 使用 Salutation::mr 方式引用枚举类型。
  • 可以显示的指定一个后台类型,如上例中的char。如果不显示指定,默认是int类型。
    待续。。。

原文地址:https://www.cnblogs.com/sword03/p/10017475.html

时间: 2024-10-11 19:37:36

C++11 带来的新特性 (1)的相关文章

VS2013带来的&quot;新特性&quot;

VS2013除了引入"Bootstrap"库以外,最大的变化就是.net Framework 4.5以下的都不支持了.也就是说,如果不把.net库升级成.net Framework4.5, 那么MVC, WebApi等等都用不了. 1.把开源的东西简单包装下.Bootstrap是免费的. 2.把基础框架版本号升级,以前的基础平台运行不了,Win7的.net framework3.5,out了,用Windows8.1吧,Windows server2008用不了了. Bootstrap库

RAC 11.2的新特性

网格即插即用(GPnP) 网格即插即用帮助管理员来维护集群,以前增加或删除节点需要的一些手动操作的步骤现在可以由GPnP来自动实现. GPnP不是一个单独的概念,它依赖于以下特性:在一个XML配置文件中储存集群信息:集群时间同步(CTSS):网格命名服务(GNS):单一客户端访问名称(SCAN):服务器池(Server Pools). GPnP为公网和私网连接.ASM spfile.CSS投票盘定义了元数据网络接口,profile.XML文件通过wallet保护以避免被修改.如果你需要手动修改p

ArcGIS API For Javascript新版本3.11中的新特性

ArcGIS API For Javascript新版本3.11中的新特性: 更简短的引用URL:如果你正在将用以前的版本的程序更新到新版本的话,这是很重要的. To update your code for version 3.11 references, replace the following URLs accordingly: /3.10/js/dojo/ should now read /3.11/ (note the dropped "/js/dojo") 将你的源码更新

Xcode 11.4 发布新特性

Xcode 11.4 发布新特性 Xcode 11.4 包含适用于 iOS 13.4,iPadOS 13.4,tvOS 13.4,watchOS 6.2 和 macOS Catalina 10.15.4 的SDK.Xcode 11.4 版本支持在 iOS 8+,tvOS 9+ 以及 watchOS 2+ 的设备上调试,同时需要运行 macOS Catalina 10.15.2+ 版本的 Mac. 通用 • Xcode 11.4 可以构建和分发支持 通用购买 的 macOS 应用.要将 macOS

发布倒计时!JDK11为我们带来哪些新特性?

今年7月底,JDK11已经进入了Rampdown Phase Two阶段,这标志着该版本所有特性已经被冻结,不会有新的JEP会加入版本中. 这一阶段将会修复P1–P2级BUG,之后,JDK11预定于今年9月25日发布.确定发布的17个JEP如下,其中包括14个新特性以及3个移除的功能: 181: Nest-Based Access Control(基于嵌套的访问控制) 309: Dynamic Class-File Constants(动态类文件常量) 315: Improve Aarch64

TypeScript系列1-1.5版本新特性

1. 简介 随着PC端快速向移动端迁移,移动(体验)优先的概念也越来越响.由于ReactJS目前移动端仅仅支持iOS,因此移动端Web开发框架只能选择: AngularJS/Angula2 + Ionic框架 + Cordova.想要学习好Angula2以及阅读其代码, 就必须了解和学习TypeScript,也因此需要学习好ES6以及Web Component.近期将开始学习TypeScript语言. 下面先看看TypeScript语言的发展: 鉴于JavaScript这种脚本语言很难应用于大规

Xcode8 带来的新特性和坑

Xcode8新特性 Interface Builder 随着14年的iPhone6和6P出来之后,iPhone的屏幕尺寸也越来越多,屏幕适配是一个需要解决的问题,以后不一定苹果又出什么尺寸的iPhone呢. 在iPhone6和6P发布的同一年,苹果推出的Xcode6中在原有的Auto layout的基础上,添加了Size Classes新特性,通过这个新特性可以使用一个XIB或者SB文件,适配不同的屏幕以及iPhone和iPad两种设备. 在Xcode8中,苹果推出了更加强大的可视化编辑工具预览

云计算为数据中心带来的新特性

在云计算的环境下,计算资源.网络资源和存储资源都可以作为业务发放给用户,从而使得资源共享变得更加灵活和广泛,减少了用户的硬件购置,升级维护等成本终端用户可以使用各种类型的瘦客户端,在任何地方接入建立在云计算上的各类应用.理论上来说,相对于应用装在用户本地终端的传统方法,云计算用户应该获得相同或甚至更好的用户体验.为了达到这样的效果,对于支撑云计算的数据中心就有了更多新的要求.本文将逐一阐述这些数据中心的新特性,并探讨为了满足这些新特性而产生的核心技术及其演进预期.本文所述的数据中心都是指互联网数

C++11的模板新特性-变长参数的模板

这个特性很赞,直接给例子吧,假如我要设计一个类,CachedFetcher内部可能使用std::map也可能使用std::unordered_map,也可能是其它的map,怎么设计呢?没有C++11变长模板之前这很费劲.. 因为map的模板参数可不是只有key,value两个啊,还有一些有默认参数的template参数... ? ? template<typename _Key, typename _Value, template<class _Kty, class _Ty, typename