(1.3)C++Primer 第一章 控制流、类
1.4 控制流
“控制流” 是 “程序执行的顺序”—— 默认情况下,程序按 “从上到下、从左到右” 的顺序执行;但实际需求中,我们需要 “根据条件判断是否执行某段代码”(分支)或 “重复执行某段代码”(循环)。本节介绍 C++ 最基础的两种控制流语句:if(分支)和for(循环)。
1.4.1 if语句:条件分支
if语句的作用是 “如果某个条件成立,就执行一段代码;否则执行另一段代码(可选)”。
语法结构
// 单分支:条件成立则执行if (条件表达式) {代码块1; // 条件为true时执行}// 双分支:条件成立执行代码块1,否则执行代码块2if (条件表达式) {代码块1; // 条件为true时执行} else {代码块2; // 条件为false时执行}
-
条件表达式:必须是 “布尔类型”(
bool)——true(真,非 0 值会被当作true)或false(假,0 会被当作false)。 -
代码块:若只有一条语句,
{}可以省略;但为了代码清晰、避免后续修改出错(如误加语句),建议无论多少条语句都加{}。
示例:判断一个数是否为正数
#include<iostream>usingnamespace std;intmain(){int num;cout << "请输入一个整数:";cin >> num;if (num > 0) { // 条件:num大于0cout << num << "是正数" << endl;} elseif (num < 0) { // 额外分支:num小于0(else if可多个)cout << num << "是负数" << endl;} else { // 剩余情况:num等于0cout << num << "是零" << endl;}return0;}
1.4.2 for语句:循环
for语句的作用是 “重复执行一段代码,直到满足终止条件”—— 特别适合 “已知循环次数” 的场景(如遍历 1 到 10 的整数)。
语法结构
for (初始化表达式; 条件表达式; 更新表达式) {循环体; // 条件为true时执行,执行后更新表达式}
-
初始化表达式:循环开始前执行一次,通常用于定义和初始化循环变量(如
int i = 0)。 -
条件表达式:每次执行循环体前判断 —— 若为
true,执行循环体;若为false,退出循环。 -
更新表达式:每次执行完循环体后执行,通常用于更新循环变量(如
i++,让i自增 1)。
示例:计算 1 到 10 的和
#include<iostream>usingnamespace std;intmain(){int sum = 0; // 存储总和,初始值为0// 循环:i从1到10(共10次)for (int i = 1; i <= 10; ++i) {sum += i; // 等价于sum = sum + i,每次将i加到sum中}cout << "1到10的和是:" << sum << endl; // 输出结果:55return0;}
循环变量的作用域
-
上述代码中,
int i = 1是在for的 “初始化表达式” 中定义的 —— 根据 C++11 标准,这样的i的作用域仅限于for循环内部(循环结束后,i就不能再使用了),这是推荐的写法(避免变量污染外部作用域)。 -
若在
for循环外定义i(如int i; for (i = 1; ...)),则i的作用域会延伸到for循环之后,不推荐。
1.5 类简介
C++ 是 “面向对象编程语言”,而 “类”(class)是面向对象的核心 —— 类的作用是 “封装数据(属性)和操作数据的函数(方法)”,形成一个 “自定义类型”。本节不深入讲解类的实现,而是通过 C++ 标准库中的Sales_item类,让读者初步理解 “如何使用类”(后续章节会详细讲解类的定义和封装)。
1.5.1 Sales_item类的作用
Sales_item是一个 “用于处理书籍销售数据的类”,封装了以下信息(数据)和操作(方法):
-
数据:书籍的 ISBN 编号(唯一标识一本书)、销售数量、单价、总销售额。
-
方法:
-
读取销售记录(从
cin读取)。 -
输出销售记录(到
cout输出)。 -
累加销售记录(将两本相同 ISBN 的书的销售数量和总销售额相加)。
-
1.5.2 使用Sales_item类的前提
要使用Sales_item类,需要满足两个条件:
- 包含头文件
:
#include "Sales_item.h"—— 注意这里用的是双引号"",而非尖括号<>:-
尖括号
<>:用于包含标准库头文件(如<iostream>),编译器会到 “系统标准库目录” 中查找。 -
双引号
"":用于包含自定义头文件(如Sales_item.h,通常是自己写的或第三方库的头文件),编译器会先到 “当前源文件所在目录” 查找,找不到再到系统标准库目录查找。
-
- 获取
Sales_item.h文件:该文件不是 C++ 标准库的默认文件,需要从《C++ Primer》的官方网站(或配套资源)下载,并存放在与源文件相同的目录中。
1.5.3 示例:使用Sales_item处理销售数据
#include<iostream>#include"Sales_item.h" // 包含Sales_item类的头文件usingnamespace std;intmain(){Sales_item book1, book2; // 定义两个Sales_item类型的变量(类似int a;)// 读取两本相同ISBN的书的销售记录cout << "请输入第一本书的销售记录(ISBN 数量 单价):";cin >> book1; // 调用Sales_item的输入方法cout << "请输入第二本书的销售记录(ISBN 数量 单价):";cin >> book2;// 检查两本书的ISBN是否相同(==运算符被Sales_item重载了)if (book1.isbn() == book2.isbn()) {Sales_item total = book1 + book2; // 累加销售记录(+运算符被重载了)cout << "两本书的总销售记录:" << total << endl; // 输出总记录return0;} else {cerr << "两本书的ISBN不同,无法累加!" << endl; // cerr:标准错误流return-1; // 返回非0值,表示程序异常结束}}
关键概念:运算符重载
-
上述代码中,
cin >> book1、book1 + book2、book1.isbn() == book2.isbn()等操作,看起来是 “对类的对象使用标准运算符”—— 这是 C++ 的 “运算符重载” 特性:类可以自定义>>、+、==等运算符的行为,让对象的操作更直观(就像操作int、double等基本类型一样)。 cerr:是 “标准错误流”,与
cout的区别是:cerr不缓冲,错误信息会立即显示;而cout是缓冲的,可能延迟显示 —— 通常用cerr输出错误信息。
更多推荐
所有评论(0)