笔记内容基于C++Primer(第5版),使用C++11标准
因笔者为初学者,故内容不会面面俱到
若有表述错误还望直接指出
——2021.7
根据C++ Primer的内容,笔记将会分为四篇内容:
- C++ 基础
- C++ 标准库
- 类设计
- 其他C++工具
文章目录
Important Prerequisites
编写一个程序:
- 定义变量
- 进行Input Output
- 使用数据结构保存与读取数据
- 处理数据内容
现在,我们从一个简单的C++程序开始认识他
每个C++程序都会包含1+个函数(function),其中规定main函数是被操作系统首先调用运行程序的主函数。下面是最最简单的(啥也干不了的)main函数示例。
int main(){
return 0;
}
在此,我们说明一下:
C++中语句以分号作为结束标记;
"//“表示该行剩余内容为注释,不会影响程序的编译与运行;
函数名前需声明函数类型,此处示例为"int”,则"return"后的返回值必须是"int"类型(后续会谈及数据类型);
返回值"0"表示程序运行成功,非零值会具体定义,表示不同的错误类型。
编译与运行C++
程序的编译运行过程与OS和编译器相关,具体可以学学《编译原理》
首先我们需要讲源代码放在源文件(source file)中,一般源文件后缀有:.cc、.cxx、.cpp、.cp、.c
以G++编译器为例子:在控制台执行命令编译程序源文件
g++ -std=c++11 first.cpp -o first
其中
变量
内置类型
整型、字符、布尔和浮点型
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | — |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
⭐基本字符类型char
单位空间应确保存放机器基本字符集中任意字符对应的数字值:单位大小应等于机器字节大小
⭐规定:一个 int
≥ 一个 short
;一个 long
≥ 一个 int
;一个 long long
≥ 一个 long
;
除了布尔型、扩展字符型,整型可以被划分为有符号signed
,无符号unsigned
两类
字面值常量(literal)
Int & Float:
20 // decimal/integer
024 // octal
0x3b // Hexadecimal
20u // unsigned integer
2000l // long integer
20ul // unsigned long integer
3.14159 // float
0.3141e1 // float/scientific notation
u8"H" // utf-8 char
u"H" // unicode char16_t
U"hello" // unicode char32_t
Characters and Strings:
'a' // Character
"abcdefg" // string
Escape Character:
"\\" // \ character
"\'" // 'character
"\"" // "character
"\?" // ? Character
"\a" // ringtone
"\b" // backspace
"\f" // change page
"\n" // Newline
"\r" // Enter
"\t" // horizontal tab
"\v" // vertical tab
"\564" // An octal number from one to three digits
"\x4f" // Hexadecimal number of one or more digits
变量
variable,提供一个具名的、可供程序操作的储存空间。对C++来说,变量和对象可互换使用。
<type> <variable_list>; //声明并定义变量
extern <type> <variable_list>; //声明非变量
命名规范:
- 体现实际含义
- 变量名小写字母
- 类名大写开头 e.g. College_student
- 多单词组成的标识符,需要有区分(下划线或驼峰法)
复合类型
e.g. 引用,指针
- 使用
&
进行引用,绑定两个值;声明引用必须初始化。
int ival = 1024;
int &refVal = ival;
⭐引用即是别名
- 指针的值一般是一个地址(或为空)
#include<iostream>
using namespace std;
int main(void){
int ival = 1024;
int *refVal = &ival;
cout << refVal << endl << *refVal;
return 0;
}
OUTPUT:
0x61fe14
1024
emmm~~~好绕啊 来整理一下
int i = 1024; //定义i
int &r = i; //表示r是一个引用
int *p; //表示p是一个指针
p = &i; //取地址符
*p = i; //解引用符
int &r2 = *p; //表应用;解引用符
int **ppi = &p; //指向指针的指针
int *&ref = p; //指针的引用
// 面对关于引用和指针的复杂语句,可以从右往左阅读,便于理解其含义
const 限定符
定义变量时加上前缀const
限定一个变量的值为不可改变的,方便调整程序全域中某个值的大小,同时防止程序运行中改变值大小。
⭐对常量的引用:
const int i = 1024;
const int &r = i; //√
int &r = i; //×
另外:
int i = 1024;
int &r1 = i; //可通过改变r1修改i的值
const int &r2 = i; //不可通过改变r2修改i的值
同理:
指向常量的指针(pointer to const)不能用于改变该常量的值;
常量指针(const pointer)不能改变指向对象;
指向常量的常量指针(const pointer to const)不能改变指向对象也不能改变指向常量的值;
int val = 1024; //变量
const int cval = 1000; //常量
const int *ptrc = &cval; //指向常量的指针
int *const cptr = &val; //常量指针
const int *const cptrc = &cval; //指向常量的常量指针
*cval = 10; //不能改指向常量的值
ptrc = &val; //能改变指向的常量
*ptrc = 10; //不能改指向常量的值
cptr = &cval; //不能改变指向的常量
*cptr = 10; //能改指向常量的值
cptrc = &val; //不能改变指向的常量
*cptrc = 10; //不能改指向常量的值
总结一下子——其实还是:
面对复杂语句,可以从右往左阅读,便于理解其含义
可以看出来,const
所处的位置代表了指向一个常量还是常量引用
处理类型
- 类型别名(type alias)
typedef <typename> <custom_typename>;
表示用自定义的名字表示默认数据类型,便于清楚该类型的用途,且该定义方式时刻传递的即:typedef <custom_typename1> <custom_typename2>
C++ 11中有了新的定义别名的方式:
using <custom_typename> = <typename>;
自定义数据结构
字符串、向量、数组
命名空间 using 声明
标准库类型
string
vector
迭代器
数组
表达式
表达式由运算对象(operand)组成,对其求值得到一个结果。字面值和变量是最简单的表达式。
作用于一个运算对象的运算符是一元运算符(unary operator);
作用于两个运算对象的运算符是二元运算符(binary operator);
作用于三个运算对象的运算符是三元运算符(仅一个);
函数调用也是特殊的运算符,对象数量没有限制。
- 复杂的表达式中,运算符符合一定的优先级(precedence)、结合律(associativity)、求值顺序(order of evaluation)
- 表达式求值的过程会伴随数据类型的转换,通常:小整数类型会被提升为较大整数类型(主要为
int
);指针不能转换为浮点数
未完(2021.9)