C++ 11 介绍 —— 基础概念
C++的基本目的是为了兼容C,因此C++11是基于C99的(ISO/IEC 9899:1999),C++主要是在其基础上扩展了一些特性,这包括基础数据类型(bool)、类(class)、模板(template)、异常(exception)、名字空间(namespace)、操作符重载(operator +)、函数名重载(function name mangle)、引用(&)、自由存储管理操作符(new/delete)以及包含一套C++标准库。
C++11标准遵循下列标准。
- Ecma International, ECMAScript Language Specification, Standard Ecma-262, third edition, 1999
- ISO/IEC 2382 (all parts), Information Technology -- Vocabulary
- ISO/IEC 9899:1999, Programming Languages -- C
- ISO/IEC 9899:1999/Cor.1:2001(E), Programming Languages -- C, Technical Corrigendum 1
- ISO/IEC 9899:1999/Cor.2:2004(E), Programming Languages -- C, Technical Corrigendum 2
- ISO/IEC 9899:1999/Cor.3:2007(E), Programming Languages -- C, Technical Corrigendum 3
- ISO/IEC 9945:2003, Information Technology -- Portable Operating System Interface (POSIX)
- ISO/IEC 10646-1:1993, Information Technology — Universal Multiple-Octet Coded Character Set (UCS)
- -- Part 1: Architecture and Basic Multilingual Plane
- ISO/IEC TR 19769:2004, Information Technology — Programming Languages, their environments and
system software interfaces — Extensions for the programming language C to support new character
data types
在C++11中,表达式范畴总是在glvalue(generalized left-hand value)、rvalue(right-hand value)、lvalue(left-hand value)、xvalue(expiring value)和prvalue(pure right-hand value)这些范畴之中,其关系表示如下:
expression
/ \
glvalue rvalue
/ \ / \
lvalue xvalue prvalue
在C++03中的lvalue仍然在C++0x中称之为lvalue,但是rvalue现在称之为prvalue。
Token
C++包含5种类型的Token,分别是标识符(identifiers)、关键字(keywords)、文字常量(literals)、操作符(operators)以及分隔符(separators)。
Comment
C++支持两种风格的注释,分别是以字符/*开始并以*/结束的注释,这些注释不能被嵌套,但可以跨越多行,以字符//开始并以换行符结束的注释。例如:
1: // This is comments
2: int main(int argc, char* argv[]) {
3: /* This
4: is
5: comments
6: */
7: return 0;
8: }
Header Name
头文件名是一个预处理token,他们仅出现在#include预处理指示符之后,其中标准库头文件以<>包围,而自定义头文件以""包围。例如:
1: #include <iostream> // This is standard header file
2: /** This is custom header file
3: * that defined const char* str = "Hello World";
4: */
5: #include "hello.h"
6:
7: int main(int argc, char* argv[]) {
8: std::cout << str << std::endl;
9: return 0;
10: }
在GCC中,以<>包含的头文件会被认为为系统头文件,它在标准系统目录中搜索对应的头文件,你能够使用-isystem包含自定义目录;以""包含的头文件会被认为为用户头文件,其首先会在包含当前文件的目录中搜索对应头文件,然后使用<>相同的目录,你能够使用-iquote包含自定义目录。
Identifier
标识符有是任意长度的数字与字母序列,其中开始字母不能为数字。合法的字母与数字如下:
字母:[a-z] [A-Z] _
数字:[0-9]
另外,有一部分标识符由C++实现与标准库保留,我们应该尽可能避免使用它们。包含双下划线__或以单下划线_开始并紧接着跟随一个大写字母的标识符被保留;
Keywords
下面列出了C++11关键字全集,其中export关键字并未使用但保留为将来使用。
alignas | alignof | asm | auto | bool | break | case | catch | char |
char16_t | char32_t | class | const | constexpr | const_cast | continue | decltype | default |
delete | do | double | dynamic_cast | else | enum | explicit | export | extern |
false | float | for | friend | goto | if | inline | int | long |
mutable | namespace | new | noexcept | nullptr | operator | private | protected | public |
register | reinterpret_cast | return | short | signed | sizeof | static | static_assert | static_cast |
struct | switch | template | this | thread_local | throw | true | try | typedef |
typeid | typename | union | unsigned | using | virtual | void | volatile | wchar_t |
while |
Operators and Punctuators
{ } [ ] # ## ( ) <: :> <% %> %: %:%: ; : ... new delete ? :: . .* + - * / % ˆ & | ~ ! = < >
+= -= *= /= %= ˆ= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* ->
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
Literals
文字常量包含整形文字常量、字符文字常量、浮点文字常量、字符串文字常量、布尔文字常量、指针位置常量、用户定义的文字常量。
Integer literals
整形文字常量有3中表示形式,分别是十进制、八进制与十六进制表示。比如:
1: int ival = 12; long lval = 12L; long long llval = 12LL;
2: int oival = 014; long olval = 014L; long long ollval = 014LL;
3: int xival = 0xc; long xlval = 0xcL; long long xllval = 0xcLL;
4:
5: unsigned uival = 12U; unsigned long ulval = 12UL; unsigned long long ullval = 12ULL;
6: unsigned ouival = 014U; unsigned long oulval = 014UL; unsigned long long oullval = 014ULL;
7: unsigned xuival = 0xcU; unsigned long xulval = 0xcUL; unsigned long long xullval = 0xcULL;
相对于C++03增加了long long标准类型,其实很早之前个编译器已经支持这个类型。
Character literals
字符常量有四种表示形式,分别是char, wchar_t, char16_t, char32_t。例如:
1: char ch = 'a'; wchar_t wch = L'a'; char16_t ch16 = u'a'; char32_t ch32 = U'a';
Floating literals
例如:
1: float fval = 3.14F; float fval_ = .314e1F;
2: double dval = 40.17; double dval_ = 4.017e1;
3: long double ldval = 88.789L; long double ldval_ = .88789e2L;
String literals
字符串文字常量是一个有双引号括起来的字符序列,共有10种表示形式。其中,在C++11中引入RAW String,所有以R为前缀并包含界定符(delimiter)的字符串即为raw字符串。比如:
1: const char* str = "hello world"; // narrow-char string literal.
2: const wchar_t* wstr = L"hello world"; // wchar_t string literal
3: const char16_t* str16 = u"hello world"; // char16_t string literal
4: const char32_t* str32 = U"hello world"; // char32_t string literal
5:
6: const char* utf8_str = u8"hello world"; // utf-8 string
1: const char* raw_str = R"(hello world)";
2: const wchar_t* raw_wstr = LR"(hello world)";
3: const char16_t* raw_str16 = uR"(hello world)";
4: const char32_t* raw_str32 = UR"(hello world)";
5:
6: const char* raw_utf8_str = u8R"(hello world)";
Boolean literals
布尔文字常量是关键字true和false。
Pointer literals
指针文字常量是关键字nullptr,它的类型是std::nullptr_t,而不是整型值。例如:
1: int* ptr = nullptr;
User-defined literals
C++11新增加用户定义的文字常量,例如:
一个用户定义的文字常量被视为调用一个文字常量操作符或文字常量操作符模板,注意。例如:
1: long double operator "" _w(long double);
2: std::string operator "" _w(const char16_t*, size_t);
3: unsigned operator "" _w(const char*);
4:
5: int main() {
6: 1.2_w; // call operator "" _w(1.2L), type is long double
7: u"one"_w; // call operator "" _w(u"one", 3), type is std::string
8: 12_w; // call operator "" _w("12"), type is unsigned
9: "two"_w; // error: no applicable literal operator
10:
11: return 0;
12: }