写在开头:这篇笔记是以前初学c++时写下的,当初还是个编程小白,不知道如何入门c++,全靠生啃Primer c++来学习。现在想来这的确是个笨办法,效率着实不高,但是当初的笔记还是有点意思的,发出来记录一下学习的痕迹。
2 变量和基本类型
2.1 基本内置类型
2.1.1 算术类型
分为算术类型和空类型(void)
带符号和无符号
带符号(signed) | 无符号(unsigned) | |
---|---|---|
特征 | 可表示正数、负数、0 | 仅能表示大于0的数 |
整型 | int,short,long,long long | unsigned long,unsigned (int) |
字符型 | signed char | unsigned char |
类型
char
和类型signed char
以及unsigned char
并不一样,尽管有三种字符型,但是表现形式只有带符号和无符号两种。类型char
会表现为上述两种中的一种,具体由编译器决定。
选择类型准则
-
明确数值不为负,用无符号
-
算术表达式中不用char或bool,如要用,必须明确使用带符号还是无符号
-
浮点运算用double不用float,因为float通常精度不够且两者计算代价差不多
2.1.2 类型转换
详见个人总结:c++的字段格式转化总结_c++字段_salahuya的博客-优快云博客
注意:若无符号数和负值的有符号数放在同一个算术表达式里,会将有符号数转换成无符号数,具体数值由int所占位数而定。如:
unsigned u1 = 10, u2 = 42;
int i1 = -42, i2 = 42;
cout<< u1 - u2 << endl;//4294967264
cout<< i1 - i2 << endl;//-84
cout << i1 - u1 << endl;//4294967244
cout << u1 - i1 << endl;//52
2.1.3 字面值常量
整型 | 20(十进制) | 024(八进制) | 0x14(十六进制) | ||
浮点型 | 3.14159 | 3.14159E0 | 0. | 0e0 | .01 |
字符 | ‘a’ | ||||
字符串 | “hello world” |
转义序列
指定字面值类型
true和false是bool类型的字面值
nullptr是指针字面值
2.2 变量
2.2.1 变量定义
c++11新标准——列表初始化:
int a = 0;
int a = {0};
int a{0};
int a(0);
//四种皆可
2.2.2 变量声明与定义
若要在多个文件中使用同一个变量,就必须使用extern
关键字声明这个变量,且extern语句不能包含初始值,否则会变成定义。若是在函数体内部初始化由extern标记的变量,甚至会报错。
extern int i;//声明i
int j; //定义j
extern int k = 1;//定义k,有可能报错
变量只能被定义一次,但是可以多次声明。
2.2.3 标识符
2.3 复合类型
2.3.1 引用
引用是为一个已存在的对象起另一个名字,引用即别名
int i = 1024;//赋值
int &r = i;//引用,r指向i
r = 10;//此时相当于给i赋值10
2.3.2 指针
&:取地址符
*:解引用符
void*指针可以存放任意对象的地址。
指向指针的引用
指针是对象,引用不是,因此存在指向指针的引用,但是没有指向引用的指针。
int i = 4, j = 8;
int *p = &i;//p是一个int型指针
int *&r = p;//r是一个对指针p的引用
//此时*p=*r=i=4
r = &j;//r引用了一个指针,因此给r赋值&j就是令p指向j
//此时*p=*r=j=8
*r = 0;//解引用r得到j,也就是p指向的对象,将j的值改为0
//此时*p=*r=j=0
2.4 const限定符
const对象创建后其值就不再改变,因此必须初始化。
默认状态下,const对象仅在文件内有效,除非添加extern声明。
const的引用,即常量引用,不能修改其引用的对象
指针和const
-
底层const:表示指针所指对象是一个常量。想要存放常量对象的地址,只能用指向常量的指针,不能改变对象的值
-
顶层const:表示指针本身是个常量。必须初始化,指针的值,即所指向的地址不能改变
分清两者的区别
const int i = 1;
const int *p1 = &i;//p1是一个指向常量对象的常量指针,即底层const
int j = 2;
int *const p2 = &j;//p2将一直指向j,即顶层const
2.5 处理类型
typedef:类型别名
auto:通过初始值来推算变量类型
decltype:选择并返回操作数的数据类型,结果是引用类型,必须初始化
auto item = val1 + val2;//由val1和val2相加的结果推断item的类型
decltype(f()) sum=x;//sun的类型就是函数f的返回类型
2.6 自定义数据结构
struct类:类内部定义的名字必须唯一,但可以与外部定义的名字重复。
为确保各个文件中类的定义一致,类通常被定义在头文件里。
预处理器
#ifdef
:当且仅当变量已定义时为真
#ifndef
:当且仅当变量未定义时为真。
一旦检查结果为真,则执行后续操作直至遇到#endif
为止
#ifndef SALES_DATA
#define SALES_DATA
#include <string>
struct Sales_data{...};
#endif
3 字符串、向量和数组
3.1 命名空间的using声明
using namesapce std;
头文件中不应包含using声明。
3.2 标准库类型string
-
string遇到空白即停止
-
使用getline可读取一整行,代替原来的>>运算符
-
empty()判断string对象是否为空
-
size()返回string对象长度(返回的是size_type类型而非int,这是一个无符号类型,总是不小于0)
string line;
while(getline(cin,line))
if (!line.empty() && line.size() < 80)
cout << line << endl;
- 遍历string对象中的字符,可使用
for(auto c : s)
- 改变字符串中的单个字符:
string s;
for(auto &c : s) c = toupper(c);
//c是一个引用,因此赋值语句将改变s中的字符值,此处是将字符转换成大写
-
使用字符串下标可直接获取对应字符
-
cctype头文件中处理单个字符的标准库函数:
3.3 标准库类型vector
vector容器
初始化vector:
分清圆括号和花括号
vector<int> v1(10);//10个元素,每个都初始化为0
vector<int> v1{10};//10个元素,每个都是空string对象
vector操作:
3.4 迭代器iterator
auto b = v.begin(), e = v.end();//b和e类型相同,b表示v的第一个元素,e表示最后一个元素
3.5 数组
数组不允许拷贝和赋值
3.6 多维数组
指针和多维数组:多维数组实际上是数组的数组,所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针。
4 表达式
左值:对象的值(内容)
右值:对象的身份(在内存中的位置)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VCWcUBUo-1685283240302)(https://gitee.com/salahuya/typora-image/raw/master/img/20230420232417.png)]
5 语句
5.3 条件语句
switch语句
switch(ch)
{
case 'a':
case 'b':
case 'c':
break;//最好不要省略case分支最后的break语句
}
5.4 迭代语句
范围for语句
c++11新标准引入的for语句,语法形式如下:
for(auto &r : v)//对v中的每个元素
r *= 2;//将v中每个元素的值翻倍
5.6 try语句块和异常处理
异常处理包括:
- throw表达式
- try语句块:以关键字try开始,并以一个或多个catch子句结束
- 一套异常类
6 函数
break;//最好不要省略case分支最后的break语句
}
## 5.4 迭代语句
### 范围for语句
c++11新标准引入的for语句,语法形式如下:
```c++
for(auto &r : v)//对v中的每个元素
r *= 2;//将v中每个元素的值翻倍
5.6 try语句块和异常处理
异常处理包括:
- throw表达式
- try语句块:以关键字try开始,并以一个或多个catch子句结束
- 一套异常类