Ch1 快速入门
1.1 编写简单的C++程序
1、操作系统通过调用main函数来执行程序,main函数则执行自己的语句并返回一个值给操作系统。main函数是唯一被操作系统显式调用的函数,操作系统通过返回值来确定程序是否执行完毕。任何其他非0的返回值,操作系统都有定义的含义。main函数的返回类型必须是int。
不同的返回值操作系统如何响应?
2、函数的4个元素:返回类型、函数名、形参表和函数体。
3、编译与执行程序
$ g++ main.cc -o a.exe
$是系统提示符,该命令生成一个可执行文件a.exe。在UNIX环境下,可执行文件没有后缀。
在UNIX操作系统,通过echo $?来获取状态。
补充编译过程。
1.2 初窥输入/输出
流是指要从某种IO设备上读入或写出的字符序列。
1.2.1 标准输入与输出对象
标准输入:cin,标准输出:cout,标准错误:cerr,用来输出警告和错误信息,标准日志:clog。
-
-
- 一个使用IO库的程序
-
- 操作符左侧必须是输入流或者输出流对象,右侧是要输入流或者输出流的值。输出操作的返回值是输出流本身。
- 操纵符endl换行,并刷新与设备相关联的缓冲区。
- 使用标准库中的名字
使用命名空间可以避免无意中与标准库索定义名字相同的名字而引发的冲突。
- 读入流
输入操作符返回其左操作数。
程序中变量在操作系统中的位置。
1.3 关于注释
注释并不会增加可执行程序的大小,编译器会忽略所有注释。
1.4 控制语句
while (cin >> val)遇到文件结束符EOF(ctrl+z)或者无效输入则结束循环。
1.5 类的简介
通过定义类来定义自己的数据结构。
- Sales_item对象上的操作
+、>>、<<、=、比较等。
- 读入和写出Sales_item对象
只有由类定义的操作可被用于该类类型的对象。
1.6 C++程序
Ch2 变量和基本类型
类型确定了数据和操作在程序中的含义。
2.1 基本内置类型
算数类型的存储空间依机器而定。
2.1.1 整型
整数、字符和布尔值的算数类型合称为整型。
- 带符号和无符号类型
- 整型值的表示
- 整型的赋值
一般是取模,负数是加上最大值的倍数后取模。
2.1.2 浮点型
float精度为6位,double为10位。
2.2 字面值常量
只能用它的值称呼它,且不能修改。只有内置类型有字面值,也没有任何标准库类型的字面值。
- 整型字面值规则
0开头8进制,0x或0X开头16进制。
字面值整数常量的类型是int或long,精度类型取决于字面值。通过加后缀能够强制将字面值整数常量转换成long、unsigned或unsigned long类型。
- 浮点字面值规则
默认的浮点字面值常量为double类型。在后面加F或f表示单精度。
- 布尔字面值和字符字面值
布尔:false或true。
字符:一对单引号来定义。
- 非打印字符的转义序列
转义字符都以反斜号开始。
\ooo,“ooo”标识3个8进制数字。
\xddd,一个x和1或多个16进制数字组成。
- 字符串字面值
为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。
- 字符串字面值的连接
- 多行字面值
2.3 变量
2.3.1 什么是变量
1、左值:可以出现在赋值语句的左边或右边。
右值:只能出现在赋值语句的右边。
2、左值或右值的使用影响程序的操作或性能,特别是在想函数传递值或者函数返回值的时候。
3、对象就是内存中具有类型的区域,计算左值表达式就会产生对象。
2.3.2 变量名
1、C++关键字
常用关键字的含义。
2、变量命名习惯
2.3.3 定义对象
1、复制初始化:“=”,直接初始化:使用“()”,语法灵活,且效率更高。
2、初始化不是赋值,“赋值”是擦除对象的当前值,并用新值替代。
3、有些类类型只能使用直接初始化完成。
4、有多个初始化式时不能使用复制初始化。
2.3.4 变量初始化规则
1、内置类型变量的初始化
函数体外的初始化为0,函数体内的不进行自动初始化。
2、类类型变量的初始化
2.3.5 声明和定义
变量的定义用于为变量分配存储空间。
2.3.6 名字的作用域
用来区分名字不同意义的上下文叫作用域。
2.4 const限定符
1、定义const对象
常量仍然是左值,但是不能被修改。必须在定义时初始化。
2、const对象默认为文件的局部变量
2.5 引用
引用就是对象的另一个名字。主要用作函数的形式参数,且其为复合类型(用其他类型定义的类型)。引用必须与该引用同类型的对象初始化。
- 引用是别名
2、const引用
const引用是指向const对象的引用。将普通的引用绑定到const对象是不合法的。
2.6 typedef名字
定义类型的同义词。
- 隐藏特定类型的实现,强调使用类型的目的。
- 简化复杂类型的定义,便于理解。
- 语序一种类型用于多种目的,同时使得每次使用该类型的目的明确。
2.7 枚举
1、定义和初始化枚举
2、枚举成员是常量
用来初始化枚举成员的值必须是常量表达式,在编译阶段就能计算出结果的整形表达式。
3、每个enum都定义一种唯一的类型
枚举类型的对象的初始化只能通过其枚举成员或同一枚举类型的其他对象来进行。
2.8 类类型
1、从操作开始设计类
接口、操作。
- 定义Sales_item类
类体可以为空。
空类的大小。
- 类的数据成员
构造函数控制数据成员的初始化。
- 访问标号
2.9 定义自己的头文件
1、头文件用于声明而不是用于定义
2、一些const对象定义在头文件中
Ch3 标准库类型
- string:大小可变的字符串。
vector:指定类型大小可变的集合。
bitset:操作位的集合。
- 迭代器用于访问标准库中一些类型的元素,其是数组和指针的抽象。
- 基本数据类型是数值或字符的抽象。
- 抽象:只需知道其支持哪些操作,不关心其是如何实现的。
- 命名空间:简化对标准库中所定义名字的访问。
3.1 命名空间的using声明
1、“::”操作符的含义是:右操作数的名字可以在左操作数的作用域中找到,左操作数是一个命名空间。
2、using声明形式:using namespace::name;。
3.2 标准库string类型
3.2.1 string对象的定义和初始化
副本:通过复制一个对象的数据来创建一个新的、独立的对象。副本的核心特点是与原对象具有相同的值,但占用不同的内存空间,因此修改副本不会影响原对象(反之亦然)。
string s1; // 默认构造函数s1位空串
string s2(s1); // 将s2初始化为s1的副本
string s3(“value”); // 将s3初始化为一个字符串字面值副本
string s4(n, ‘c’); // 将s4初始化为字符串‘c’的n个副本
3.2.2 string对象的读写
cin特点:
- 忽略开头所有空白字符;
- 遇到空白字符读取终止。
1、标准库iostream。
2、读取未知数目的输入
string word;
while (cin >> word) // 未达到文件尾且未遇到无效输入
3、用getline读取整行文本
string line;
while (getline(cin, line)) // getline遇到的第一个字符是换行符直接返回,string为空
3.2.3 string对象的操作
s.empty(); // s为空则为true;否则false
s.size(); // s中字符的个数,返回类型string::size_type,与机器无关类型
s[n]; // 返回s中位置为n的字符,是左值
s1 + s2; // 返回一个新的字符串,+操作符左右操作数必须至少有一个是string类型
s1 = s2; // s1是s2的副本
s1 == s2; // 相等返回true
!=, <, >, <=, >=;
string st1, st2 = "The expense of spirit";
st1 = st2;
赋值操作必须先把st1占用的相关内存释放掉,然后再分配给st1足够存放st2副本的内存空间,最后把st2中的所有字符复制到新分配的内存空间。
字符处理:cctype头文件中定义。
3.3 标准库vector类型
vector被称为容器,是一个类模板。
3.3.1 vector对象的定义和初始化
vector<T> v1; // vector保存类型为T对象,默认构造函数v1为空
vector<T> v2(v1); // v2是v1的一个副本
vector<T> v3(n, i); // v3包含n个值为i的元素
vector<T> v4(n, i); // v4包含n个值初始化的元素的副本
3.3.2 vector对象的操作
v.empty() 如果v为空,返回true,否则返回false
v.size() v中元素的个数
v.push_back(t) 在v的末尾增加一个值为t的元素
v[n] 返回v中位置为n的元素,下标只能读不能插入元素
v1 = v2 把v1的元素替换为v2中元素的副本
v1 == v2 如果v1与v2相等,则返回true
3.4 迭代器简介
迭代器:检查容器内元素,并遍历元素的数据类型;使用解引用操作符来访问迭代器所指向的元素。
任何改变容器长度的操作都会使得已存在的迭代器失效。
3.5 标准库bitset类型
bitset是类模板,在定义时要明确bitset的位数。
3.5.1 bitset对象的定义和初始化
bitset<n> b; b有n位,每位都0
bitset<n> b(u); b是unsigned long型u的一个副本
bitset<n> b(s); b是string对象s中含有的位串的副本,反向转化
bitset<n> b(s, pos, n); b是s中从位置pos开始的n个位的副本
3.5.2 bitset上的操作
// 位操作
b.set(); // 所有位设置为1
b.set(pos); // 设置pos位为val
b.reset(); // 所有位重置为0
b.reset(pos); // 重置pos位
b.flip(); // 所有位取反
b.flip(pos); // pos位取反
// 访问元素
b[pos]; // 访问pos位
b.test(pos); // 检查pos位是否为1
// 容量信息
b.size(); // 返回位数N
b.count(); // 返回1的个数
b.any(); // 是否有任意位为1
b.none(); // 是否所有位都为0
b.all(); // 是否所有位都为1
// 类型转换
b.to_ulong(); // 转为unsigned long
b.to_ullong(); // 转为unsigned long long
b.to_string(); // 转为string
Ch4 数组和指针
指针可以像迭代器一样用于遍历和检查数组中的元素。
设计良好的程序只有在强调速度时才在类的内部使用数组和指针。
4.1 数组
4.1.1 数组的定义和初始化
没有所有元素都是引用的数组。
数组的为数必须用大于等于1的常量表达式定义。
- 显式初始化数组元素
用{}括起来的一组用逗号分隔的初值。不需要指定数组的维数值。
- 特殊的字符数组
可用字符串字面值进行初始化。字面值包含空字符null用于结束字符串。
- 不允许数组直接复制和赋值
4.1.2 数组操作
vector下标类型:vector::size_type,数组下标类型size_t。
4.2 指针的引入
4.2.1 什么是指针
取地址操作符只能用于左值。
指针用于指向对象。
4.2.2 指针的定义和初始化
每个指针都有一个与之关联的数据类型。
void*指针只支持几种有限的操作:
与两一个指针进行比较;像函数传递void*指针或从函数返回void*指针;给另一个void*赋值。
4.2.3 指针操作
1、生成左值的解引用操作
2、指针和引用的比较
引用总是指向某个对象,且必须初始化。
3、指向指针的指针
4.2.4 使用指针访问数组元素
1、指针的算数操作
指针的加减n等效于指针指向其后或前的第n个元素。
指针与指针相减得到ptrdiff_t类型。
2、解引用和指针算数操作之间的相互作用
指针加减后仍是指针,可进行解引用操作。
3、下标和指针
数组名是指向数组第一个元素的指针。
4、计算数组的超出末端指针
C++允许计算数组或对象超出末端的地址,但不允许进行解引用。
- 输出数组元素
- 指针是数组的迭代器
4.2.5 指针和const限定符
1、指向const对象的指针
(1)const double *cptr;
cptr是指向double类型const对象的指针,const限定对象类型。cptr本身不是const,在定义时不需要初始化,允许给cptr重新赋值,使其指向另一个const对象,但不能通过cptr修改其指向对象的值。
(2)不能使用void*指针保存const对象的地址,必须使用const void*。
(3)允许把非const对象的地址赋值给const对象的指针。
2、const指针
int err_no;
int *const cur = &err_no;
不能使cur指向其它对象,由于其指向的对象非const,其指向的对象的值可被修改。
- 指向const对象的const指针
- 指针和typedef
typedef string *ptr;
const ptr cstr;
cstr是指向string类型对象的const指针,即string *const cstr;
4.3 C风格字符串
字符串字面值的类型是const char类型的数组。C风格字符串以null结束。
strlen总是嘉定其参数字符串以null结束。
4.3.1 创建动态数组
int *pa = new int[10];
后跟()即要求编译器对数组做值初始化。
调用new动态创建长度为0的数组是合法的。
delete [] pa;
9098

被折叠的 条评论
为什么被折叠?



