风格约定:
橙色字体:固定名词
红色字体:重要
挖坑:目前没有理解,之后理解了再补充
1)加粗字体:小标题
重要概念或理论
1.1编写一个简单的C++程序
如下式一个简单的main函数,功能是返回给操作系统一个值:
//程序1.1.0
int main()
{
return 0;
}
- C++程序均包含一个或多个函数,其中必须有一个main函数,系统通过调用main函数来运行C++程序。
- 一个函数的定义包括四个部分:返回类型,函数名,括号包括的形参列表以及花括号包含的函数体。如程序1.1.0中,返回类型为int,函数名为main,形参列表为空,函数体为return 0;
- int类型是一种内置类型:即语言自己定义的类型
- return函数:它结束函数的执行,并向调用者(可以使其他函数或者系统)返回一个值。其返回值的类型必须与函数返回类型相同。
- 多数系统中,main的返回值用于指示状态,0表示成功,非0由各个系统定义。
重要概念:类型
程序处理的数据保存在变量中,每个变量都有对应的类型。类型定义了数据元素的内容以及可以在该数据元素上进行的运算。
1.1.1编译、运行程序
自行选择编译器,我是入了CLion坑。
编译器能够提示的错误:
- 语法错误
- 数据类型错误(不匹配)
- 声明错误:C++中任何变量都要先声明后使用
1.2输入输出
1)C++输入输出机制
C++没有定义输入输出语句,而是采用了标准库iostream来提供IO机制。标准库iostream包含了输入流istream和输出流ostream两个类型。
一个流就是一个字符序列,其想要表达的是随着时间的推移,字符是顺序生成或消耗的。
2)C++标准输入输出
- 标准输入cin:istream类型对象,关联标准输入,用于程序的正常输入
- 标准输出cout:ostream类型对象,关联标准输出,用于程序的正常输出
- 错误错误cerr:ostream类型对象,关联到标准错误,使用cerr输出的数据是不经过缓冲的,会立刻输出。用于输出错误信息或者警告信息
- clog:ostream类型对象,关联到标准错误,写入到clog的数据是要缓冲的,一般用于报告程序的执行信息,写入日志中。
3)IO库例程
#include <iostream>
int main() {
std::cout << "Enter two number:" << std::endl;
int v1 = 0,v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " "<< "and" << v2 << "is" << v1+v2 << std::endl;
std::clog << "The program is end" << std::endl;
std::cerr << "no error happend" << std::endl;
}
程序输出:
- #include <iostream>作用是告诉编译器我们要使用iostream库。尖括号中的名字指出了一个头文件,通常程序所有的#include指令写在程序的最前面。
- std::cout表示我们这里使用的cout是定义在名为std的命名空间中的,这有效避免了不同命名空间中相同名字的冲突。其中,::为作用域运算符。指定名字在特定空间的格式为namespace::name。
4)向流写入数据
std::cout << "Enter two number:" << std::endl;
- 向流写入数据的理解是将程序中的数据写入到流中,再输出给IO设备。
- 该语句是执行了一个表达式。C++中,表达式由一个或多个运算对象和(通常是)一个运算符组成,是最小的计算单元。
- 该表达式中,<<为输出运算符,其左侧运算对象应为ostream对象,其右侧运算对象为要打印的值。输出运算符将右侧给定的值写入左侧的对象中,计算结果为写入了给定值的ostream对象。
- 针对该表达式,第一个输出运算符的结果成为了第二个输出运算符的左侧对象,即该表达式相当于:
(std::cout << "Enter two number:" ) << std::endl;
- 第二个输出运算符的右侧对象std::endl为一个操作符。其作用是结束当前行(即换行),然后将设备缓冲区(buffer)中的内容刷新到设备中。在调试程序时,时刻保持buffer中的内容刷新到设备中是至关重要的,程序正常运行无所谓,但程序崩溃时可能输出还停留在buffer中,从而造成错误分析不正确。
5)从流读取数据
std::cin >> v1 >> v2;
- 从流读取数据是从IO设备中读取数据到程序中
- 该表达式中的>>为输入运算符,他的左侧对象为istream对象,他从左侧给定的istream对象读取数据,存到右侧对象中,最后返回左侧istream对象作为其计算结果。
- 该表达式中,第一个输入运算符的计算结果作为第二个输入运算符的左侧istream对象,因此该表达式的含义是读入两个值,将第一个值存入v1,将第二个值存入v2。
1.3注释简介
C++中共有单行注释和界定符注释两种注释方法。
1)单行注释//
//这是一个单行注释
单行注释可以注释额外的“/”符号
- 单行注释以//开始,以换行符结束,能够注释一行
2)界定符注释/**/
/*这是
*界定符
*注释的
*标准格式
*/
- 界定符注释以/*开始,以*/结束,会注释掉包含在/*与*/之间的所有内容。
- 注释内的每一行都使用*开头,以表明这是注释的一部分
- 界定符注释不可以嵌套,这会使系统报出难以理解的错误,一般容易发生在调试程序时,想注释一段程序,但里面的某一段已经被注释了。因此,现在编译器的多行注释快捷方式大多是使用的是多个单行注释组合。
/*我是注释/*这样嵌套注释是禁止的*/我是注释*/
/*我是注释/*我是注释*/
/*我是注释*/我是注释*/
/*我是注释*//*我是注释*/
/*我是注释/*我是注释/*我是注释*/我是注释/*我是注释*//*我是注释*//*我是注释*/
- 真要有接界定符注释嵌套,从左侧第一个/*开始向后找到第一个*/为一组注释;从右侧第一个*/开始往前找到第一个/*为一组注释。
1.4控制流
一般程序是顺序执行的,但C++提供了多种不同的控制流语句,用于让程序按照更复杂的路径执行。包括:while语句,for语句,if语句
1.4.1while语句
#include <iostream>
int main() {
int num = 0,val = 1;
while(val <= 10){
num += val;
++val;
}
std::cout << "The sum of 1 to 10 is " << num << std::endl;
return 0;
}
- while语句首先判断()中的条件condition是否为真,如果为真,则执行{}内的语句statement,执行完毕后再次检查()的条件是否为真,如果为真,则再次执行{}内语句,直至条件为假。
- <=为小于等于运算符,其左侧对象小于等于右侧对象时返回真,否则返回假。
- +=为复合赋值运算符,其将左侧与右侧的对象相加,并将结果保存到左侧中。a += b;等效于a = a + b;
- ++为前缀递增运算符时,其对象在运算符的右侧,含义是将其右侧的对象值加1
- --为前缀递减运算符时,其对象在运算符的右侧,含义是将其右侧的对象值减1
- i++和++i区别
- while语句使用格式为:
while(condition){
statement
}
1.4.2for语句
#include <iostream>
int main() {
int num = 0;
for(int val = 1; val <= 10; ++val)
{
num += val;
}
std::cout << num << std::endl;
return 0;
}
- for语句的格式如下。上面程序中int val =1为初始化语句;val <= 10 为循环条件;++val为表达式。
for(初始化语句;循环条件;表达式){
statement
}
- for语句的优势在于给定循环次数时候做循环次数控制;而while语句的优势在于根据某个表达式的真假来确定循环是否执行
- for语句是在函数体都完成后在进行表达式操作,然后在判断循环条件。以for(i=0,i<5;i++)为例,当i=1时,符合条件,执行函数体,函数体执行完了之后在进行i++,使得i=2,然后判读是否满足i< 5,满足的话执行下一次循环。而while(i<5)的循环语句会在每次循环开始前判断一下i<5 是否满足,而i++的操作可以在任意地方进行。
1.4.3读取数量不定的输入数据
#include <iostream>
int main() {
int num1 = 0, num2 = 0;
std::cout << "Enter the num:" << std::endl;
while(std::cin >> num2)
{
num1 += num2;
}
std::cout << num1 << std::endl;
return 0;
}
- 这里循环条件是std::cin >> num2;当使用一个istream对象作为条件时候,判断其真假就是在检测流的状态。如果输入是有效的(这里有效情况是输入一个整数),则流有效,状态为真。如果输入是无效的(例如输入的不是整数,不满足num2的类型)或者输入的是文件结束符(end-to-file),则流无效,状态为假。
- 不同系统中文件结束符的输入方式不一样,按照书上说WIN下是Ctrl+Z;Ubuntu下是Ctrl+D。实测WIN10下也是Ctrl+D。
1.4.4 if-else语句
#include <iostream>
int main() {
int num1 = 0;
std::cin >> num1;
if(num1 > 5){
std::cout << "The num > 5" << std::endl;
}
else{
std::cout << "The num < 5" << std::endl;
}
return 0;
}
- if-else语句格式:
if(condition){
statement1
}
else{
statement2
}
当condition为真时,执行statement1;当condition为假时,执行statement2.
1.5类简介
C++中类的作用:C++中通过定义一个类,定义了一种数据结构,以及与之相关的全部操作。是C++的核心特性之一。每一个类都应以了一种新的类型,其类型名就是类名。
类的引用:一般通过头文件访问自己定义的类。头文件的命名一般以“类名.h”命名。也有用.hpp和.hxx结尾的。编译器对头文件的后缀没有要求,但一些IDE对头文件的后缀有要求。
当调用标准库时候:
#include <标准库名头文件明>
当调用非标准库时候:
#include “头文件名”
文件重定向:(待测试)
测试程序时,我们可以利用系统重定向功能代替键盘输入读入数据,并输出数据到指定文件中,方法如下:
1)首先生成可执行文件addItems.exe
2)将输入文件infile和输出文件outfile与可执行文件放在一个文件夹内
3)在当前文件夹打开终端运行
$ addItems <infile>outfile
其中,addItems,infile和outfile都应和可执行文件,输入文件,输出文件名称保持一致。
成员函数的调用
Sales_item.isbn()
- 成员函数(方法):成员函数是定义的类的一部分函数
- 成员函数的调用格式:类名.成员函数名(参数)。其中“.”是点运算符,只能用于类对象,其左侧对象必须是一个类类型的对象(类类型即类定义的类型,名称为类名),右侧对象必须是该类的一个成员名,运算结果为右侧指定的成员。“()”为调用运算符,用于调用函数,括号里面放实参列表,也可以为空。