C++ 备忘单
提供基本语法和方法的 C++ 快速参考备忘单。
开始
Hello.cpp
int main() {
std::cout << "Hello QuickRef\n";
return 0;
}
编译和运行
$ g++ hello.cpp -o hello
$ ./hello
Hello QuickRef
变量
int number = 5; // Integer
float f = 0.95; // Floating number
double PI = 3.14159; // Floating number
char yes = 'Y'; // Character
std::string s = "ME"; // String (text)
bool isRight = true; // Boolean
// Constants
const float RATE = 0.8;
int age {25}; // Since C++11
std::cout << age; // Print 25
原始数据类型
数据类型 尺寸
范围
int
4字节
-2 31 ~ 2 31 -1
float
4字节
不适用
double
8 字节
不适用
char
1 字节
-128 ~ 127
bool
1 字节
true / false
void
不适用
不适用
wchar_t
2 或 4 个字节
1 个宽字符
用户输入
int num;
std::cout << "Type a number: ";
std::cin >> num;
std::cout << "You entered " << num;
交换
int a = 5, b = 10, temp;
temp = a;
a = b;
b = temp;
// Outputs: a=10, b=5
std::cout << "a=" << a << ", b=" << b;
注释
// A single one line comment in C++
/ This is a multiple line comment
in C++ /
if 语句
if (a == 10) {
// do something
}
请参阅:条件
for 循环
for (int i = 0; i < 10; i++) {
std::cout << i << "\n";
}
请参阅:循环
函数
void hello(); // Declaring
int main() { // main function
hello(); // Calling
}
void hello() { // Defining
std::cout << "Hello QuickRef!\n";
}
请参阅:函数
参考
int i = 1;
int& ri = i; // ri is a reference to i
ri = 2; // i is now changed to 2
std::cout << "i=" << i;
i = 3; // i is now changed to 3
std::cout << "ri=" << ri;
ri并i引用相同的内存位置。
命名空间
namespace ns1 {int val(){return 5;}}
int main()
{
std::cout << ns1::val();
}
namespace ns1 {int val(){return 5;}}
using namespace ns1;
using namespace std;
int main()
{
cout << val();
}
命名空间允许名称下的全局标识符
C++ 数组
声明
int marks[3]; // Declaration
marks[0] = 92;
marks[1] = 97;
marks[2] = 98;
// Declare and initialize
int marks[3] = {92, 97, 98};
int marks[] = {92, 97, 98};
// With empty members
int marks[3] = {92, 97};
std::cout << marks[2]; // Outputs: 0
操作
┌─────┬─────┬─────┬─────┬─────┬─────┐
| 92 | 97 | 98 | 99 | 98 | 94 |
└─────┴─────┴─────┴─────┴─────┴─────┘
0 1 2 3 4 5
int marks[6] = {92, 97, 98, 99, 98, 94};
// Print first element
std::cout << marks[0];
// Change 2th element to 99
marks[1] = 99;
// Take input from the user
std::cin >> marks[2];
显示
char ref[5] = {'R', 'e', 'f'};
// Range based for loop
for (const int &n : ref) {
std::cout << std::string(1, n);
}
// Traditional for loop
for (int i = 0; i < sizeof(ref); ++i) {
std::cout << ref[i];
}
多维数组
j0 j1 j2 j3 j4 j5
┌────┬────┬────┬────┬────┬────┐
i0 | 1 | 2 | 3 | 4 | 5 | 6 |
├────┼────┼────┼────┼────┼────┤
i1 | 6 | 5 | 4 | 3 | 2 | 1 |
└────┴────┴────┴────┴────┴────┘
int x[2][6] = {
{1,2,3,4,5,6}, {6,5,4,3,2,1}
};
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 6; ++j) {
std::cout << x[i][j] << " ";
}
}
// Outputs: 1 2 3 4 5 6 6 5 4 3 2 1
C++ 条件
if 语句
if (a == 10) {
// do something
}
int number = 16;
if (number % 2 == 0)
{
std::cout << "even";
}
else
{
std::cout << "odd";
}
// Outputs: even
Else if 语句
int score = 99;
if (score == 100) {
std::cout << "Superb";
}
else if (score >= 90) {
std::cout << "Excellent";
}
else if (score >= 80) {
std::cout << "Very Good";
}
else if (score >= 70) {
std::cout << "Good";
}
else if (score >= 60)
std::cout << "OK";
else
std::cout << "What?";
运算符
关系运算符
a == b a 等于 b
a != b
a 不等于 b
a < b
a 小于 b
a > b
a 更大 b
a <= b
a 小于或等于 b
a >= b
a 大于或等于 b
赋值运算符
a += b
又名 a = a + b
a -= b
又名 a = a - b
a *= b
又名 a = a * b
a /= b
又名 a = a / b
a %= b
又名 a = a % b
逻辑运算符
exp1 && exp2
两者都是真的(AND)
exp1 || exp2
要么为真(或)
!exp
exp是假的(不是)
位运算符
a & b
二进制与
a | b
二进制或
a ^ b
二进制异或
a ~ b
二进制补码
a << b
二进制左移
a >> b
二进制右移
三元运算符
┌── True ──┐
Result = Condition ? Exp1 : Exp2;
└───── False ─────┘
int x = 3, y = 5, max;
max = (x > y) ? x : y;
// Outputs: 5
std::cout << max << std::endl;
int x = 3, y = 5, max;
if (x > y) {
max = x;
} else {
max = y;
}
// Outputs: 5
std::cout << max << std::endl;
Switch 语句
int num = 2;
switch (num) {
case 0:
std::cout << "Zero";
break;
case 1:
std::cout << "One";
break;
case 2:
std::cout << "Two";
break;
case 3:
std::cout << "Three";
break;
default:
std::cout << "What?";
break;
}
C++ 循环
While
int i = 0;
while (i < 6) {
std::cout << i++;
}
// Outputs: 012345
Do-while
int i = 1;
do {
std::cout << i++;
} while (i <= 5);
// Outputs: 12345
Continue 语句
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
std::cout << i;
} // Outputs: 13579
无限循环
while (true) { // true or 1
std::cout << "infinite loop";
}
for (;;) {
std::cout << "infinite loop";
}
for(int i = 1; i > 0; i++) {
std::cout << "infinite loop";
}
for_each (从 C++11 版本开始)
void print(int num)
{
std::cout << num << std::endl;
}
int main()
{
int arr[4] = {1, 2, 3, 4 };
std::for_each(arr, arr + 4, print);
return 0;
}
Range-based (从 C++11 版本开始)
int num_array[] = {1, 2, 3, 4, 5};
for (int n : num_array) {
std::cout << n << " ";
}
// Outputs: 1 2 3 4 5
std::string hello = "QuickRef.ME";
for (char c: hello)
{
std::cout << c << " ";
}
// Outputs: Q u i c k R e f . M E
Break 语句
int password, times = 0;
while (password != 1234) {
if (times++ >= 3) {
std::cout << "Locked!\n";
break;
}
std::cout << "Password: ";
std::cin >> password; // input
}
几种变体
for (int i = 0, j = 2; i < 3; i++, j--){
std::cout << "i=" << i << ",";
std::cout << "j=" << j << ";";
}
// Outputs: i=0,j=2;i=1,j=1;i=2,j=0;
C++ 函数
参数和返回
int add(int a, int b) {
return a + b;
}
int main() {
std::cout << add(10, 20);
}
add 是一个接受 2 个整数并返回整数的函数
Overloading 超载
void fun(string a, string b) {
std::cout << a + " " + b;
}
void fun(string a) {
std::cout << a;
}
void fun(int a) {
std::cout << a;
}
内置函数
int main() {
// sqrt() is from cmath
std::cout << sqrt(9);
}
C++ 预处理器
预处理器ifelifelseendififdefifndefdefineundefincludelineerrorpragmadefined__has_include__has_cpp_attributeexportimportmodule
Includes 包括
Defines 定义
If 如果
console.log('hi');
...
...
Error 错误
Macro 宏
Token concat 令牌连接
DST(object); #=> object_s object_t;
Stringification 字符串化
char a = STR(object); #=> char a = "object";
file and line 文件和行
其他
转义序列
\b 退格
\f
换页
\n
换行
\r
返回
\t
水平标签
\v
垂直标签
\\
反斜杠
\'
单引号
\"
双引号
\?
问号
\0
空字符
关键词
alignas
alignof
and
and_eq
asm
atomic_cancel
atomic_commit
atomic_noexcept
auto
bitand
bitor
bool
break
case
catch
char
char8_t
char16_t
char32_t
class
compl
concept
const
consteval
constexpr
constinit
const_cast
continue
co_await
co_return
co_yield
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
not
not_eq
nullptr
operator
or
or_eq
private
protected
public
reflexpr
register
reinterpret_cast
requires
return
short
signed
sizeof
static
static_assert
static_cast
struct
switch
synchronized
template
this
thread_local
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq
final
override
transaction_safe
transaction_safe_dynamic
另见
C++ 信息图表和备忘录(hackingcpp.com) C++ 参考 (cppreference.com)
C++ 语言教程 (cplusplus.com)