C++17
C++17 是C++标准委员会于2017年制定的标准(ISO/IEC 14882),接替C++14标准,后被C++20标准取代。 历史 在C++标准委员会制定此次的三年期标准之前,C++17标准的发布日期是不确定的。在这段日期中,C++17草案(draft)也被称为C++1z,正如C++11草案名C++0x或C++1x,C++14草案名C++1y。C++17标准于2017年3月完成国际标准草案(Draft International S…
共 93 篇文章
C++17 是C++标准委员会于2017年制定的标准(ISO/IEC 14882),接替C++14标准,后被C++20标准取代。 历史 在C++标准委员会制定此次的三年期标准之前,C++17标准的发布日期是不确定的。在这段日期中,C++17草案(draft)也被称为C++1z,正如C++11草案名C++0x或C++1x,C++14草案名C++1y。C++17标准于2017年3月完成国际标准草案(Draft International S…
Erase–remove惯用法是C++程序设计语言常用的技术,用于在C++标准模板库容器中删除元素。 动机 一个常见的编程任务是从集合(collection)中删除等于某个值或满足某个标准的所有元素。C++语言可以通过手写循环完成这个任务。但更好的办法是使用C++标准模板库中的算法来实现。这些算法并不从容器删除元素,而是把不“符合”删除标准的元素搬移到容器的前部,并保持这些元素的相对次序。该算法一次通过数据范围即可实现该目标。 由于没有…
模板超編程(,縮寫:TMP)是一種超編程技術,編譯器使用模板產生暫時性的源碼,然後再和剩下的源碼混合並編譯。這些模板的輸出包括編譯時期常數、資料結構以及完整的函式。如此利用模板可以被想成編譯期的執行。這種技術被許多語言使用,最為知名的當屬C++,其他還有Curl、D、Eiffel,以及语言扩展,如。 模板元编程的构成要素 使用模板作為元编程的技術需要兩階段的操作。首先,模板必須被定義;第二,定義的模板必須被實體化才行。 模板的定義描述了…
constexpr是C++11引入的关键字,用于编译时的常量与常量函数。 声明为constexpr函数的意义是:如果其参数均为合适的编译期常量,则对这个constexpr函数的调用就可用于期望常量表达式的场合(如模板的非类型参数,或枚举(enum)常量的值)。如果参数的值在运行期才能确定,或者虽然参数的值是编译期常量,但不-{zh-cn:匹配;zh-tw:符合;}-这个函数的要求,则对这个函数调用的求值只能在运行期进行。 简介 C++编…
C++23,正式名称ISO/IEC 14882:2024,是继C++20之后的C++编程语言开放标准。2020年2月,在捷克布拉格举行的C++20最终会议上,通过了C++23的总体计划。第一次针对C++23的WG21会议原定于2020年6月在保加利亚瓦尔纳举行,但由于2019冠状病毒病疫情而被迫取消。 原定于2020年11月在美国纽约召开的会议也被取消。 该标准于2023年2月由WG21在美国伊瑟阔举行的混合会议上从技术上最终确定。 新…
C++26是继C++23之后正在修订中的C++编程语言开放标准草案,其正式版本预计将于2026年发布。目前已发布的修订草案为N4981。 特性 已被C++26接受的新特性包括: 语言特性 未求值字符串(Unevaluated strings)。 将 @、$ 和 ` 添加到基本字符集。 支持从 void 进行 constexpr 转换。 用户自定义的 static_assert 消息。 无命名的占位变量(Placeholder varia…
Boost C++ 函式庫(Libraries)是一組擴充C++功能的經過同行評審(Peer-reviewed)且開放源碼程式庫。大多數的函式為了能夠以開放源碼或者封閉專案的方式運作,而授權於Boost軟體授權條款(Boost Software License)之下。許多Boost的開發人員是來自C++標準委員會,而部份的Boost函式庫成為C++的TR1標準之一。 為了要確保函式庫的效率與彈性,Boost廣泛的使用C++模板功能。而它…
在一个C或者C++语言的程式代码中,一个在头文件便已包含了所有宏、函数和类的实现,而且在包含了头文件后这些实现都可以被编译器读取访问;以这种头文件所实现的函式庫便叫做仅标头库或純標頭檔函式庫(Header-only)。仅标头库并不需要分开编译、封包和安装即可使用;只需指导编译器到该些头文件的路径,还有使用#include预处理器导入该些头文件进应用程式代码即可使用。此外,因程式代码的可读性和存在,编译器的最佳化器可以更佳地扫描代码。 缺…
C动态内存分配是在C语言中为了实现动态内存分配而进行的手动内存管理。这种管理是通过C標準函式庫中的malloc、realloc、calloc、free 等函数进行的。 C++ 为了兼容 C 语言也提供这些函数,但是更推荐使用 new、delete 操作符来完成类似的操作。 malloc 所实际使用的内存分配机制有很多不同的实现,执行时间和内存消耗各有不同。 函数概述 C 动态内存分配函数在头文件 stdlib.h 中声明(C++ 中对应…
C语言和C++的关系相當密切,但是也存在许多显著的差异。C++标准起源于早期C标准,并被设计与当时的C语言在源代码编写和链接方面很大程度上兼容。因此,两种语言的开发工具(例如IDE和编译器)通常被放到单个产品中,程序员可以自己选择编写的是C还是C++,开发工具通常会根据程序员的选择使用不同的编译器、链接器和不同的函式库。 但是,C并不是C++的一部分,一般的C代码不经修改,很难严格符合C++标准;同样,C++引入了许多C中没有的特性,所…
C++是一种被广泛使用的计算机程序设计语言。它是一种通用程式設計語言,支援多重编程范式,例如過程化程序設計、面向对象程序設計、泛型程式設計和函数式程序設計等。 比雅尼·斯特勞斯特魯普博士在贝尔实验室工作期间在20世紀80年代發明並實現了C++。起初,這種語言被稱作“”(“包含‘類’的C語言”),作為C語言的增強版出現。随后,C++不斷增加新特性。虚函数、运算符重载、多繼承、标准模板库、异常处理、运行时类型信息、命名空間等概念逐漸納入標準…
名字修饰(name decoration),也称为名字重整、名字改编(name mangling),是现代计算机程序设计语言的编译器用于解决由于程序实体的名字必须唯一而导致的问题的一种技术。 它提供了在函数、结构体、类或其它的数据类型的名字中编码附加信息一种方法,用于从编译器中向链接器传递更多语义信息。 该需求产生于程序设计语言允许不同的条目使用相同的标识符,包括它们占据不同的命名空间(典型的命名空间是由一个模块、一个类或显式的name…
C++11,先前被稱作C++0x,即ISO/IEC 14882:2011,是C++程式語言的一个標準。它取代第二版標準ISO/IEC 14882:2003(第一版ISO/IEC 14882:1998公開於1998年,第二版於2003年更新,分别通稱C++98以及C++03,两者差异很小),且已被C++14取代。相比于C++03,C++11標準包含核心語言的新機能,而且擴展C++標準程式庫,併入了大部分的C++ Technical Rep…
Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中。POD通常被用在系统的边界处,即指不同系统之间只能以底层数据的形式进行交互,系统的高层逻辑不能互相兼容。比如当对象的字段值是从外部数据中构建时,系统还没有办法对对象进行语义检查和解释,这时就适用POD来存储数据。 定义 POD类型包括下述C++类型,以及其cv-qualified的类型,…
模板偏特化是模板特化的一种特定形式。它通常用于C++程序设计语言,允许程序员只特化模板的部分模板参数;与之相对的是显式全特化,即提供所有的模板参数。 模板与特化 类模板本质上是元类(meta-classe):它们是部分抽象的数据类型,为编译器提供指令,指导编译器如何生成带有正确数据成员的类。例如,C++ 标准库容器都是类模板。当程序员使用std::vector时,需要用特定的数据类型对其进行实例化,例如int、string 或 doub…
依赖于实参的名字查找是C++程序设计语言中的名字查找机制之一。英文为“argument-dependent lookup”,因此缩写为ADL。ADL依据函数调用中的的数据类型查找未限定(unqualified)的函数名(或者函数模板名)。这也被称作“克尼格查找”(Koenig lookup),虽然安德鲁·克尼格并不是它的发明者。 语义 前置基础 两个关键概念: 普通未限定名字查找:C++ 基础的名字查找规则,从当前作用域 → 外层作用域…
结构解引用运算符(),也称“通过指针访问成员运算符”(Element selection through pointer),是 C语言与C++的->运算符。其功能是获取运算符左侧的指针所指向的对象的某个成员()。例如: struct foo{ int value; } foo p=new foo(); std::cout 该运算符的优先级较高,与函数调用运算符( )、数组下标运算符[ ]、通过引用选择成员运算符.相同。也是自左向右结合。…
比雅尼·斯特劳斯特鲁普(,,),生于丹麦奥胡斯郡,计算机科学家。他以创造C++编程语言而闻名,被称为“C++之父”。 用斯特劳斯特鲁普他本人的话来说,自己“发明了C++,写下了它的早期定义并做出了首个-{zh-hans:实现; zh-hant:實作;}-……选择制定了C++的设计标准,设计了C++主要的辅助支持环境,而且负责处理C++标准委员会的扩展提案。”他还写了一本《C++程序设计语言》,它被许多人认为是C++的范本经典,目前是第四…
三法則()以及五法則在C++裡,它是一個以設計的基本原則而制定的定律。 規則 它的要求是,假如类有明顯定義下列其中一個成員函式,那麼程序员必須寫入其他兩個成員函式到類別內,也就是說下列三個成員函式缺一不可 。 解構子 複製建構子 設定運算子 (C++) 上述三個函式是,假如程式設計師沒有自行定義或宣告這三個函式,編譯器會自動地建立他們並且編譯到應用程式內。然而,如果程式設計師僅定義其中一個,其餘兩個函式仍然會由編譯器自動產生,這種混雜的…
在C++程式語言裡,設定運算子(英文:assignment operator)是用等號 = 符號。就像其他的C++運算子一樣,它可以作為多載。 複製設定運算子是一個特別的設定運算子,通常是用來把已存在的物件指定給其他相同類別的物件。它是一個特別的成員函式,如果程式設計師沒有定義這個成員函式,那麼編譯器會自動地產生這個成員函式。編譯器產生的程式碼是以單一成員進行物件複製的動作。 複製設定運算子,這個成員函式與複製建構子的相異點在於,它一定…