编写一个简单的程序

  • 函数:包含4部分:返回类型,函数名,形参列表,函数体。其中函数体是一个语句块。
  • main函数:每个cpp程序都有且仅有一个main,os通过调用main来运行程序。main函数的返回类型必须为int,被用于指示状态,0表示成功返回,非0值由系统定义,常用于指出错误类型。
  • 类型:一种类型不仅定义了数据元素的内容,还定义了这类数据上可进行的操作。即:类型=内容+操作

编译、运行程序

  • 后缀:C++源文件的常见后缀名包括:.cc .cxx .cpp .cp .C
  • 执行:unix中可执行文件的名称任意,执行时输入完整文件名。windows中可执行文件后缀为.exe,执行时不需输入.exe
  • 查看返回值:可在程序执行完后用echo查看main函数返回值,unix中用echo $?,windows中用echo %ERRORLEVEL%
  • GNU编译g++ -o prog1 prog1.cc,其中-o prog1指定输出文件名,未指定时为a.out。另外可用-std=c++11来开启C++ 11
  • VS编译cl /EHsc prog1.cpp,其中/EHsc是编译器选项,用于打开标准异常处理。VS生成的可执行文件名与第一个源文件名相同,后缀为.exe
  • 开启warning:GCC中用-Wall,VS中用/W4

初识输入输出

  • 在标准库iostream中提供IO机制
  • 2个基础IO类型istreamostream,分别是输入流和输出流,一个流是一个字符序列
  • 4个IO对象:标准输入cin,标准输出cout,标准错误cerr,一般信息clog,系统经常将程序运行的窗口与这些对象关联,即这些对象与程序运行的窗口交互
  • 头文件:使用标准库的设施都应用#include来包含相关头文件,通常#include必须出现在所有函数之外
  • 表达式:一个表达式产生一个计算结果,它由一个或多个运算对象和一个或多个运算符组成
  • 输出运算符<<:接受两个对象,左侧一个ostream对象,右侧是要打印的值。此运算符将右侧对象的值写入左侧ostream对象中,返回左侧ostream对象,级联时从左到右结合。因此级联时,同一个ostream对象被从左到右的一系列«操作,即从左到右输出值。
  • 操纵符endl:写入此操纵符的效果是结束当前行,并刷新缓冲区,即,将与设备关联的缓冲区中的内容刷到设备中。若不手动刷新,则需等到缓冲区满才会自动刷新,所以建议调试时每一步都使用endl手动刷新(比较耗时)
  • 命名空间:帮助避免名字冲突,标准库定义的所有名字都在std
  • 作用域运算符:::用std::cout来指定命名空间std中的cout名字
  • 初始化:初始化一个变量,就是在变量创建的同时为其赋值。
  • 输入运算符>>:接受两个对象,左侧一个istream对象,右侧是要被写入的变量。此运算符从左侧istream对象中读入数据,存入右侧对象中,返回左侧istream对象,级联时从左到右结合。因此级联时从同一个istream对象中连续读入数据,依次放入从左往右的对象中。
  • 运算符重载:例如int v; std::cout<<"value is "<<v<<std::endl;的代码,三个<<处理的对象类型不一样,是不同的运算符。标准库定义了不同类型的运算符来处理不同类型的对象,遇到匹配的时自动选择。

注释简介

  • 有两种注释:单行注释//和界定符对注释/* */
  • 界定符对跨越多行时,最好显式指出内部行属于多行注释,风格是每行一个星号开头,例如:
1
2
3
4
5
/* 
 * this is a comment, 
 * continue ...
 */

  • 单行注释以双斜线//开始,以换行符结束,可进行单行或半行注释,注释内容可包含任何文本包括重复的双斜线
  • 界定符对注释不能嵌套,(所以调试时最好用单行注释)

控制流

while语句

  • while先判断后执行,do...while先执行后判断
  • 条件是一个返回真或假的表达式
  • 语句块是语句的一种,任何可使用语句的地方都可用语句块
  • i++和++i的区别:i++在语句执行后对i自增,++i在语句执行前对i自增。另外,从运行速度来讲,由于i++返回i的值,而++i返回i的引用,所以对于类类型,++i更快。

for语句

  • for循环头中声明的变量,只在循环头和循环体中有效
  • for循环头:一个初始化语句;一个循环条件;一个表达式
  • for和while都是先判断后执行
  • 每一次都是循环体执行完后再执行循环头中的表达式

读取数量不定的输入数据

  • 用while实现,当istream对象作为条件时,只要流是有效的,就返回true
  • 当遇到EOF,或从流中读到的数据无法转为右侧对象时,流变为无效
  • 手动输入EOF:unix中用ctrl+d,windows中用ctrl+z然后enter
  • 编译器能检查出的错误:语法错误(syntax error),类型错误(type error),声明错误(declaration error)
  • debug好习惯:按照报错的顺序修改,每修改一个就立即重新编译

if语句

  • 注意===的返回值都能作为真假被if接受

类简介

  • 一个类定义了一个类型,以及与其关联的一组操作
  • 习惯上,头文件根据其中定义的类的名字来命名
  • 头文件的后缀通常为.h .H .hpp .hxx,标准库的头文件通常不带后缀。编译器一般不关心头文件名的形式。

Sales_item类

  • 包含来自标准库的头文件时应用尖括号<>,不属于标准库的头文件用双引号""
  • 文件重定向:大多数系统都可用a.out <infile >outfile来将infile内容作为标准输入,并将标准输出写入到outfile

初识成员函数

  • 成员函数是定义为类的一部分的函数,有时也被称为方法
  • 点运算符只能用于类类型的对象,其左侧是类类型的对象,右侧是该对象的一个成员名
  • 调用运算符()用于调用一个函数

书店程序

  • 例子:书店程序
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include"Sales_item.h"
int main(){
    Sales_item total;
    if(std::cin>>total){
        Sales_item trans;
        while(std::cin>>trans){
            if(total.isbn()==trans.isbn())
                total+=trans;
            else{
                std::cout<<total<<std::endl;
                total=trans;
            }
        }
        std::cout<<total<<std::endl;
    }
    else{
        std::cerr<<"No data!"<<std::endl;
        return -1;
    }
    return 0;
}