c++ 11 新特性

C++11 委托构造函数(delegating constructor) 文章目录1. 委托构造函数2.3.4. 1. 委托构造函数      委托构造函数(delegating constructor) 是C++11中新引入的一个新特性. 它是对C++98版本中的构造函数的一个改进. 所谓"委托构造函数", 就是使用它所归属类的其他构造函数来执行它自己的初始化操作. 换言之, 就是它把自身需要做的一些初始化操作任务交付给了其他的构造函数来完成.      为了让上述的描述更加通俗易懂, 不妨结合下图来理解C++11中的委托构造函数新特性的功能. 如图1, 班主任要求A、B、C 阅读详情

赖勇浩(http://laiyonghao.com)
声明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的《The Biggest Changes in C++11(and Why You Should Care)》一文,几乎所有内容都搬了过来,但不是全文照译,有困惑之处,请参详原文(http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/ )。
注:作者 Danny Kalev 曾是 C++ 标准委员会成员。

Lambda 表达式

Lambda 表达式的形式是这样的:

[capture](parameters)->return-type {body}  

来看个计数某个字符序列中有几个大写字母的例子:

int main()  
{  
   char s[]="Hello World!";  
   int Uppercase = 0; //modified by the lambda  
   for_each(s, s+sizeof(s), [&Uppercase] (char c) {  
    if (isupper(c))  
     Uppercase++;  
    });  
 cout<< Uppercase<<" uppercase letters in: "<< s<<endl;  
}  

其中 [&Uppercase] 中的 & 的意义是 lambda 函数体要获取一个 Uppercase 引用,以便能够改变它的值,如果没有 &,那就 Uppercase 将以传值的形式传递过去。

自动类型推导和 decltype

在 C++03 中,声明对象的同时必须指明其类型,其实大多数情况下,声明对象的同时也会包括一个初始值,C++11 在这种情况下就能够让你声明对象时不再指定类型了:

auto x=0; //0 是 int 类型,所以 x 也是 int 类型  
auto c='a'; //char  
auto d=0.5; //double  
auto national_debt=14400000000000LL;//long long  

这个特性在对象的类型很大很长的时候很有用,如:

void func(const vector<int> &vi)  
{  
  vector<int>::const_iterator ci=vi.begin();  
}  

那个迭代器可以声明为:

auto ci=vi.begin(); 

C++11 也提供了从对象或表达式中“俘获”类型的机制,新的操作符 decltype 可以从一个表达式中“俘获”其结果的类型并“返回”:
const vector<int> vi;  
typedef decltype (vi.begin()) CIT;  
CIT another_const_iterator;  

统一的初始化语法

C++ 最少有 4 种不同的初始化形式,如括号内初始化,见:

std::string s("hello");  
int m=int(); //default initialization 

还有等号形式的:
std::string s="hello";  
int x=5;  
对于 POD 集合,又可以用大括号:
int arr[4]={0,1,2,3};  
struct tm today={0};  
最后还有构造函数的成员初始化:
struct S {  
 int x;  
 S(): x(0) {} };  
这么多初始化形式,不仅菜鸟会搞得很头大,高手也吃不消。更惨的是 C++03 中居然不能初始化 POD 数组的类成员,也不能在使用 new[] 的时候初始 POD 数组,操蛋啊!C++11 就用大括号一统天下了:
class C  
{  
int a;  
int b;  
public:  
 C(int i, int j);  
};  
C c {0,0}; //C++11 only. 相当于 C c(0,0);  
int* a = new int[3] { 1, 2, 0 }; /C++11 only  
class X {  
  int a[4];  
public:  
  X() : a{1,2,3,4} {} //C++11, 初始化数组成员  
};  
还有一大好事就是对于容器来说,终于可以摆脱 push_back() 调用了,C++11中可以直观地初始化容器了:
// C++11 container initializer  
vector vs<string>={ "first", "second", "third"};  
map singers =  
  { {"Lady Gaga", "+1 (212) 555-7890"},  
    {"Beyonce Knowles", "+1 (212) 555-0987"}}; 
而类中的数据成员初始化也得到了支持:
class C  
{  
 int a=7; //C++11 only  
public:  
 C();  
};  

deleted 函数和 defaulted 函数

像以下形式的函数:

struct A  
{  
 A()=default; //C++11  
 virtual ~A()=default; //C++11  
};  

叫做 defaulted 函数,=default; 指示编译器生成该函数的默认实现。这有两个好处:一是让程序员轻松了,少敲键盘,二是有更好的性能。
与 defaulted 函数相对的就是 deleted 函数:
int func()=delete;  
这货有一大用途就是实现 noncopyabe 防止对象拷贝,要想禁止拷贝,用 =deleted 声明一下两个关键的成员函数就可以了:
struct NoCopy  
{  
    NoCopy & operator =( const NoCopy & ) = delete;  
    NoCopy ( const NoCopy & ) = delete;  
};  
NoCopy a;  
NoCopy b(a); //编译错误,拷贝构造函数是 deleted 函数  

nullptr

nullptr 是一个新的 C++ 关键字,它是空指针常量,它是用来替代高风险的 NULL 宏和 0 字面量的。nullptr 是强类型的:

void f(int); //#1  
void f(char *);//#2  
//C++03  
f(0); //调用的是哪个 f?  
//C++11  
f(nullptr) //毫无疑问,调用的是 #2  

所有跟指针有关的地方都可以用 nullptr,包括函数指针和成员指针:
const char *pc=str.c_str(); //data pointers  
if (pc!=nullptr)  
  cout<<pc<<endl;  
int (A::*pmf)()=nullptr; //指向成员函数的指针  
void (*pmf)()=nullptr; //指向函数的指针  

委托构造函数

C++11 中构造函数可以调用同一个类的另一个构造函数:

class M //C++11 delegating constructors  
{  
 int x, y;  
 char *p;  
public:  
 M(int v) : x(v), y(0),  p(new char [MAX])  {} //#1 target  
 M(): M(0) {cout<<"delegating ctor"<<end;} //#2 delegating  

#2 就是所谓的委托构造函数,调用了真正的构造函数 #1。

右值引用

在 C++03 中的引用类型是只绑定左值的,C++11 引用一个新的引用类型叫右值引用类型,它是绑定到右值的,如临时对象或字面量。
增加右值引用的主要原因是为了实现 move 语义。与传统的拷贝不同,move 的意思是目标对象“窃取”原对象的资源,并将源置于“空”状态。当拷贝一个对象时,其实代价昂贵且无必要,move 操作就可以替代它。如在 string 交换的时候,使用 move 意义就有巨大的性能提升,如原方案是这样的:

void naiveswap(string &a, string & b)  
{  
 string temp = a;  
 a=b;  
 b=temp;  
}  

这种方案很傻很天真,很慢,因为需要申请内存,然后拷贝字符,而 move 就只需要交换两个数据成员,无须申请、释放内存和拷贝字符数组:
void moveswapstr(string& empty, string & filled)  
{  
//pseudo code, but you get the idea  
 size_t sz=empty.size();  
 const char *p= empty.data();  
//move filled's resources to empty  
 empty.setsize(filled.size());  
 empty.setdata(filled.data());  
//filled becomes empty  
 filled.setsize(sz);  
 filled.setdata(p);  
}  


要实现支持 move 的类,需要声明 move 构造函数和 move 赋值操作符,如下:
class Movable  
{  
Movable (Movable&&); //move constructor  
Movable&& operator=(Movable&&); //move assignment operator  
};  

C++11 的标准库广泛使用 move 语义,很多算法和容器都已经使用 move 语义优化过了。

C++11 的标准库

除 TR1 包含的新容器(unordered_set, unordered_map, unordered_multiset, 和unordered_multimap),还有一些新的库,如正则表达式,tuple,函数对象封装器等。下面介绍一些 C++11 的标准库新特性:

线程库

从程序员的角度来看,C++11 最重要的特性就是并发了。C++11 提供了 thread 类,也提供了 promise 和 future 用以并发环境中的同步,用 async() 函数模板执行并发任务,和 thread_local 存储声明为特定线程独占的数据,这里(http://www.devx.com/SpecialReports/Article/38883)有一个简单的 C++11 线程库教程(英文)。

新的智能指针类

C++98 定义的唯一的智能指针类 auto_ptr 已经被弃用,C++11 引入了新的智能针对类 shared_ptr 和 unique_ptr。它们都是标准库的其它组件兼容,可以安全地把智能指针存入标准容器,也可以安全地用标准算法“倒腾”它们。

新的算法

主要是 all_of()、any_of() 和 none_of(),下面是例子:

#include <algorithm>  
//C++11 code  
//are all of the elements positive?  
all_of(first, first+n, ispositive()); //false  
//is there at least one positive element?  
any_of(first, first+n, ispositive());//true  
// are none of the elements positive?  
none_of(first, first+n, ispositive()); //false  

还有一个新的 copy_n:

#include <algorithm>  
int source[5]={0,12,34,50,80};  
int target[5];  
//从 source 拷贝 5 个元素到 target  
copy_n(source,5,target);  

iota() 算法可以用来创建递增序列,它先把初值赋值给 *first,然后用前置 ++ 操作符增长初值并赋值到给下一个迭代器指向的元素,如下:

#include <numeric>  
int a[5]={0};  
char c[3]={0};  
iota(a, a+5, 10); //changes a to {10,11,12,13,14}  
iota(c, c+3, 'a'); //{'a','b','c'}  

是的,C++11 仍然缺少一些很有用的库如 XML API,socket,GUI、反射——以及自动垃圾收集。然而现有特性已经让 C++ 更安全、高效(是的,效率更高了,可以参见 Google 的 基准测试结果http://www.itproportal.com/2011/06/07/googles-rates-c-most-complex-highest-performing-language/)以及更加易于学习和使用。

如果觉得 C++ 变化太大了,不必惊恐,花点时间来学习就好了。可能在你融会贯通新特性以后,你会同意 Stroustrup 的观点:C++11 是一门新的语言——一个更好的 C++。

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南 本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。 阅读详情

相关推荐

Unity动画状态机实战:Trigger和Bool参数到底怎么选?附5个常见场景解析

本文深入解析Unity动画状态机中Trigger和Bool参数的核心差异与应用场景。通过对比两者在描述瞬时事件与持续状态上的本质区别,并结合角色移动、攻击连招、跳跃落地、受击死亡及环境交互等5个实战场景,提供了清晰的选择逻辑与避坑指南,帮助开发者构建更健壮、易维护的动画逻辑。

weixin_29009501的博客 120

C++不可拷贝基类实现

#ifndef NONCOPYABLE_HPP #define NONCOPYABLE_HPP // Private copy constructor and copy assignment ensure classes derived from // class noncopyable cannot be copied. class noncopyable { protected: #...

xu215740578的博客 415

黑金AXU9EG开发板深度学习部署全流程解析

本文详细解析了黑金AXU9EG开发板的深度学习模型部署全流程,从环境搭建、模型转换到上板验证,提供了实用的技术指导和优化技巧。该开发板基于Xilinx Zynq UltraScale+ MPSoC架构,特别适合边缘计算场景,通过FPGA加速实现高效AI推理。

weixin_29062613的博客 447

C++ 如何编写禁止拷贝的基类

//禁止拷贝基类 class noncopyable{ protected: noncopyable() {} ~noncopyable() {} private: noncopyable(const noncopyable &that) = delete;//delete拷贝构造函数 noncopyable(noncopyable &&that) = delete...

qq_32228793的博客 527

时序定江山,功耗写风骨——解读时序库lib文件的奥义【芯片设计 lib文件】

lib库,全称liberty library format file:它是Liberty时序文件的简称,使用 Liberty 语法来编写。它可以通过library compiler/dc转换成.db文件(database),供synopsis家的DC和PT使用,也可以通过spyglass的library compiler来生成sglib文件,供spyglass使用。他们是等价的,但db文件是二进制格式,人类不可读。

LogicYarn的博客 2603

「模型部署系列」ubuntu 使用vllm部署Qwen3-8B模型

解决这个问题的方法正如错误信息中所提示的,需要在命令行中显式地设置。下载单个文件到指定本地文件夹(以下载README.md到当前路径下“dir”目录为例)解决:这表明你正在使用的 Tesla T4 GPU 的计算能力为 7.5,而。,用于获取更详细的 NCCL 调试信息,当所有其他问题排除,可尝试增加。1、下载vllm v0.8.5(此处已经下好了,去仓库拉资源)在下载前,请先通过如下命令安装ModelScope。,这一错误最终致使引擎进程启动失败。更多更丰富的命令行下载选项,可参见。

汪依帆的博客 5044

no copy机制

小菜刀读Go源码时,发现一个高频注释语句“XXX must not be copied after first use“。例如sync包下的Pool、Cond、WaitGroup、Mute...

slphahaha的博客 814

Cadence安装

选择刚刚解压的E盘DVD驱动中的setup.exe文件,安装路径推荐D盘,此处会自己给你新建文件夹,我们无需手动建文件夹。但是,新产品有一些BUG(影响使用流畅性),所以我们要对17.4打补丁,补丁包同样去吴川斌的博客下载。下载阿狸狗破戒大师 我这边下载的是版本V3.2.6,同样在吴川斌的博客下载安装包,链接同上。记录一下安装过程,方便以后安装使用Cadence。破解完成后,建议将这两个软件创建快捷方式到桌面。到这里,我们已经可以正常的使用Cadence了。对光盘映像文件解压后双击,可以在我的电脑看到。

电子那些事儿 1万+

C++11中值得关注的几大变化

赖勇浩(http://laiyonghao.com)声明:本文源自 Danny Kalev 在 2011 年 6 月 21 日发表的《The Biggest Changes in C++11(and Why You Should Care)》一文,几乎所有内容都搬了过来,但不是全文照译,有困惑之处,请参详原文(http://www.softwarequalityconnection.com/2

赖勇浩的编程私伙局 8万+

PCA9548实战:从硬件连接到Linux驱动的I2C扩展全解析

本文详细解析了PCA9548 I2C多路复用器从硬件连接到Linux驱动配置的全过程。涵盖硬件引脚连接、电源去耦、地址选择等关键设计要点,以及Linux驱动加载、设备树配置和应用层编程技巧,帮助开发者高效实现I2C总线扩展。

weixin_28726391的博客 410

XPATH注入漏洞检测工具汇总

环境 > Python3.7。

墨痕诉清风的博客 742

CPP——C++ 11的新特性

本文转载自: http://www.yanjiankang.cn/cpp_11_new_feature/ Lambda 表达式 Lambda 表达式就是用于创建匿名函数的。 为什么说 lambda 表达式如此激动人心呢?举一个例子。标准 C++ 库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 和 find()。这些函数通常需要提供一个“谓词函数 predicate functi...

Monster_ixx的博客 489

Codex 100个真实案例 - 用AI做股票K线分析工具(技术指标全自动)

本案例将用 Codex 从零搭建一个完整的股票 K 线分析工具。通过自然语言驱动,我们让 AI 自动完成股票数据获取(akshare)、K 线图绘制(mplfinance + ECharts)、技术指标计算(MA/EMA/MACD/RSI/KDJ/布林带)、买卖信号提示(金叉/死叉、超买超卖)、多股对比分析、Web 可视化界面(Flask + ECharts)、PDF 报告生成以及定时监控邮件推送等全套功能。全程用自然语言指令驱动 Codex,零手写代码实现专业级量化分析平台!

yueyeguzhuo的专栏 872

【面试知识整理】CPP——C++ 11的新特性

【面试知识整理】CPP——C++ 11的新特性作者yanhealth发表于2017-02-12原创文章,转载请注明: 转载自:严健康的个人博客 http://www.yanjiankang.cn/本文链接地址: http://www.yanjiankang.cn/cpp_11_new_feature/Lambda 表达式Lambda 表达式就是用于创建匿名函数的。为什么说 lambda 表达式如此...

caogenwangbaoqiang的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Cpp::C++11新特性入门(29)

哈喽,结束了C++最难的部分,现在我们又要迎来奖励关卡了!C++11同C++98都是C++历史上比较大的一个版本,现在我们来学习一下它吧!C++11文档介绍奖励关卡结束啦,下一篇我们就要来上难度了!

tan180°的博客 2021

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

c++ 常用新特性总结【c++11】,【c++14】,【c++17】,【c++20】

一文总结了c++常见的新特性,在c++推出的新特性中,c++11无疑是最具影响力的,其次是c++17与c++14。

Ray 6228

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C++】C++11新特性的讲解

C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03C++11。

Sxy_wspsby的博客 1243

C++11新特性

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 C++11标准在2011年正式发布,相信使用过C++11新特性的小伙伴一定会被她的魅力深深地吸引,感觉是用C++写出了Python、写出了kotlin这种高级又简便的语言。博主个人非常喜欢11标准,为了方便个人查阅以及分享给好友,整理了一些特性,如有不对欢迎指出。 C++11的设计目标 使C+...

billy的博客 1748

C++11新特性详解

相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。thread在线文档说明stdreturn0。...

AI_ELF的博客 1万+

【C++】:C++11新特性

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于。

优快云官方认证C/C++研发领域优质创作者 优快云官方2023年成都赛道Top3 第16届蓝桥杯C/C++软件赛四川赛区二等奖 带你玩转C/C++ 数据结构与算法 Linux系统编程/Linux网络编程 MySQL数据库 软件测试开发 1065

【C++】——C++11新特性

C++,这门在系统开发、游戏开发、嵌入式等众多领域都占据主导地位的编程语言,一直在不断进化。C++11就像是C++家族中的一颗璀璨明星,闪耀着无数令人惊叹的新特性。如果你还在使用传统的C++编码方式,那你可能正在错过许多现代编程的便捷与高效。想象一下,用更少的代码编写出性能更高的程序,轻松应对复杂的并发场景,还能享受更加简洁和安全的内存管理。C++11就能让这一切成为现实。在这篇博文中,我会一点点揭开C++11新特性的神秘面纱,让你看到C++在这次重大更新之后所蕴含的无限潜力。

2402_85267481的博客 1875

『C++11』基础新特性

自从C++98以来,C++11无疑是一个相当成功的版本更新。它引入了许多重要的语言特性和标准库增强,为C++编程带来了重大的改进和便利。C++11的发布标志着C++语言的现代化和进步,为程序员提供了更多工具和选项来编写高效、可维护和现代的代码1998年C++标准委员会成立后,计划每五年进行一次更新在2003年C++标准委员会提交了一份技术勘误表(简称为TC1),TC1主要是对C++98标准中的漏洞进行修复,其语言的核心部分并没有大改动,这次提交可以看作一次小小的语法更新,即C++03。

Aron的博客 1783

【C++】C++11新特性

无需再拷贝一份,大大提升效率。例如某个函数返回对象时,寄存器需要有临时对象来接受,此时会调用一次拷贝构造函数,此时该临时需要赋值给新的接受对象则需要再调用一次拷贝构造,效率低下,使用右值引用寄存器中的临时对象进行语义转化,新对象接受时不用调用拷贝构造函数。,auto_ptr、unique_ptr、shared_ptr这三个智能指针模板类都定义了类似指针的对象,可以将new获得的地址赋给这种对象,当智能指针过期时,的方式,当引用计数为0时才进行析构,很好的解决了该问题,旧指针和新指针都可以使用。

csdnabcaq的博客 2103

学懂C++(六十):C++ 11、C++ 14、C++ 17、C++ 20新特性大总结(万字详解大全)

C++ 11、C++ 14、C++ 17、C++ 20新特性总结(万字详解大全)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 4807

C++11——新特性超详细总结

18. 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$17. 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

m0_65635427的博客 7635

C++11-C++17新特性介绍

本篇只包含c++11- c++17的新特性, 一些c++基本规定不再赘述前文c++规定记录了c++基本规定对于这些新特性,笔者一边学习一边做笔记,所以内容有待完善笔者使用的是 Clion+MinGW 开发环境提示:以下是本篇文章正文内容,下面案例可供参考using 覆盖了 typedef 的全部功能// 重定义unsigned int// 重定义std::map//定义函数类型和模板的结合使用// ...别名模板(alias template)

Computer_Tech的博客 2629
上一篇: 各种流行的编程风格【转自酷壳】
下一篇: OpenGL 缓冲区对象
doctorsc
博客等级 码龄19年 51粉丝 28原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值