Primer C++第一章学习

main函数

每个C++程序都包含一个或多个函数,其中一个必须命名为main,操作系统通过调用main来运行C++程序

main函数的返回类型必须为int,即整数类型,int类型是一种内置类型(built-in-type),即语言自身定义的类型

在大多数系统中,main的返回值被用来指示状态,返回值0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型

 编译器

不同编译器使用不同的后缀命名约定,最常见的包括.cc、.cxx,.cpp,.cp及.c

在不同操作和编译器系统中,运行C++编译器的命令也各不相同,最常用的编译器是GNU编译器和微软Visual Studion编译器,运行GNU编译器的命令是g++

此处,$是系统提示符,-o prog1是编译器参数,指定了可执行文件的文件名,在不同的操作系统中,此命令生成一个名为prog1或prog1.exe的可执行文件

在UNIX系统中,可执行文件没有后缀,在Windows系统中,后缀为.exe

如果省略了-o prog1参数,在UNIX系统中编译器会生成一个名为a.out的可执行文件,在Windows系统中则会生成一个名为a.exe的可执行文件

根据使用的GNU编译器的版本,可能需要制定-std=c++0x参数来打开对C++11的支持

运行微软Visual Studio 2020编译器的命令为cl

命令cl调用编译器,/EHsc是编译器选项,用来打开标准异常处理

微软编译器会自动生成一个可执行文件,其名字与第一个源文件名对应,可执行文件的文件名与源文件名相同,后缀为.exe

 输入输出流

C++语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库来提供IO机制(以及很多其他设施)

iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流

一个流就是一个字符序列,是从IO设备读出或写入IO设备的。术语“流”(stream)想要表达的是,随着时间的推移,字符是顺序生成或消耗的

标准库定义了4个IO对象,为了处理输入,使用一个名为cin的istream类型的对象,这个对象也称为标准输入,对于输出,使用一个名为cout的ostream类型的对象,此对象也称为标准输出。标准库还定义了其他两个ostream对象,名为cerr和clog,通常用cerr来输出警告和错误消息,因此它也称为标准错误,而clog用来输出程序运行时的一般性信息

系统通常将程序所运行的窗口与这些对象关联起来。因此,当读取cin,数据将从程序正在运行的窗口读入,当向cout、cerr和clog写入数据时,将会写到同一个窗口

 程序第一行

告诉编译器我们想要使用iostream库,尖括号中的名字指出了一个头文件

每个使用标准库设施的程序都必须包含相关的头文件

#include指令和头文件的名字必须写在同一行中

通常情况下,#include指令必须出现在所有函数之外,我们一般将一个程序的所有#include指令都放在源文件的开始位置

输出运算符(<<),<<运算符接受两个对象,左侧的运算符对象必须是一个ostream对象,右侧的运算符对象是要打印的值,此运算符将给定的值写到给定的ostream对象中,输出运算符的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个ostream对象

输出语句使用了两次<<运算符,因为此运算符返回其左侧的运算对象,因此第一个运算符的结果成为了第二个运算符的左侧运算对象。这样就可以将输出请求连接起来

endl,这是一个被称为操纵符(manipulator)的特殊值,写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流

cout后面输出时加endl和不加endl的区别:

(1)换行

(2)对缓冲流进行刷新,使得流中所有剩余字符被写入输出序列(调用输出流flush函数,刷新缓冲区,让数据直接写入文件或者屏幕上)

(3)应保证一直刷新流,否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误推断

前缀std::指出名字cout和endl是定义在名为std的命名空间(namespace)中的,命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突

标准库定义的所有名字都在命名空间std中

当使用标准库中的一个名字时,必须显示说明我们想使用来自命名空间std中的名字,通过使用作用域运算符(::)

 输入运算符(>>),与输出运算符类似,它接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象

从给定的istream读入数据,并存入给定对象中,输入运算符返回其左侧运算对象作为其计算结果

 由于此运算符返回其左侧运算对象,因此我们可以将一系列输入请求合并到单一语句中

本例中的输入操作从std::cin读入两个值,并将第一个值存入v1,将第二个值存入v2

C++中的输入缓冲区,当我们从键盘输入字符串的时候,需要敲一下回车才能将这个字符输入到缓冲区中,敲入的这个回车会被换成换行符,这个换行符也同样存储在缓冲区中

cin读取数据是从缓冲区中读取数据的,如果缓冲区为空,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就会触发cin的成员函数去读取数据

cin>> 可以从键盘读取想要的数据,以空格,tab键,以及换行来作为分隔符(分隔符的存在是必要的,因为如果没有分隔符,就不能区分这些数据中的那部分是给这个变量,那部分是给另外的变量,当然也可以指定分隔符了)

需要注意的是,当从缓冲区中读入数据的时候,如果缓冲区的第一个字符是空格,tab键,以及换行这些分隔符的时候,cin>>会将其忽略掉并从缓冲区中清除,继续读取下一个字符,如果缓冲区为空,那么cin会继续等待,如果读取成功,字符后面的分隔符是残留在缓冲区中的,cin>>不做处理

cin.get()函数有多种函数重载的形式,可以读取单个字符或者是一行数据,不过,对于空格,tab键,以及换行这些分隔符,是不做处理的,会当成一个字符对待

相对应的,std命名空间中也有一个getline方法,遇到换行符就终止,并且将换行符中缓冲区删除,不影响下面的处理

cin.get()读取一行的时候,只能将字符串读入c风格的字符数组中,但是getline可以将字符串读入到string类型中

cin.getline()读入一行数据,和cin.get()读入一行的方式相比,cin.getline()不会将换行符残留在缓冲区中

注释

C++中有两种注释:单行注释和界定符注释。单行注释以双斜线(//)开始,以换行符结束。另一种注释使用继承自C语言的两个界定符(/*和*/),这种注释以/*开始,以*/结束,编译器将落在/*和*/之间的所有内容都当做注释

 控制流

 

 

此表达式从标准输入读取下一个数,保存在value中,输入运算符返回其左侧运算对象,在本例中是std::cin,因此,此循环条件实际上检测的是std::cin

当使用一个istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功,当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效,处于无效状态的istream对象会使条件变为假

在Windows系统中,输入文件结束符的方法是Ctrl+Z,在UNIX系统中,文件结束符输入Ctrl+D

C++程序的缩进和格式

C++程序很大程度上是格式自由的,也就是说,我们在哪里放置花括号、缩进、注释以及换行符通常不会影响程序的语义

类简介

为了使用标准库设施,我们必须包含相关的头文件。类似的,我们也需要使用头文件来访问为自己的应用程序所定义的类。习惯上,头文件根据其中定义的类的名字来命名。我们通常使用.h作为头文件的后缀,编译器一般不会关系头文件名的形式,但有的IDE对此有特定要求

每个类实际上都定义了一个新的类型,其类型名就是类名。与内置类型一样我们可以定义类类型的变量

文件重定向

大多数操作系统支持文件重定向,这种机制允许我们将标准输入和标准输出与命名文件关联起来:

 假设$是操作系统提示符,addItems.exe可执行文件,则上述命令会从一个名为infile的文件读取记录,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录中

成员函数

成员函数是定义为类的一部分的函数,有时也被称为方法

 使用点运算符(.)来表达需要"名为item1的对象的isbn成员",点运算符只能用于类类型的对象

posted @ 2020-11-11 10:55  拓墨宣  阅读(103)  评论(0编辑  收藏  举报