一个程序中必须含有一个main函数,函数包括返回类型,函数名,形参列表(可以为空),和函数体。其中的return语句返回一个值,该返回值的类型必须和函数的返回类型相容。其中main函数的返回值用来指示状态,返回值为0表示成功。
经常使用iostream标准库,其中很多次用到cin和cout,iostream库包含两个基础类型istream和ostream分别表示输入流和输出流。一个流就是一个字符序列。标准库定义了4个IO对象,一个是cin的istream类型对象;一个cout的ostream类型的对象;一个cerr的ostream类型的对象,输出警告和错误信息;一个clog的ostream类型的对象,输出程序运行时的一般性信息。
include<iostream>
通常情况下#include指令必须出现在所有函数之外,一般将一个程序的所有#include指令都放在源文件的开始位置。
对于包含标准库的头文件时,使用<>尖括号包围头文件;对于不属于标准库的头文件时,用" "双引号来包围。
std::cout << "enter two numbers:" << std::endl;
<< 运算符接收两个运算对象:左侧运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。
<<运算符将给定的值写到给定的ostream对象中,输出运算符的计算结果就是其左侧运算对象,即写入给定值的那个ostream对象std::cout。
这样运算符返回其左侧的运算对象,第一个运算符的结果成了第二个运算符的左侧运算对象,等同于:
std::cout << "enter two numbers:";
std::cout << std::endl;
一对用双引号引起的字符序列是一个字符串字面值常量。在双引号之间的文本被打印到标准输出
endl的作用是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。
默认情况下,读cin会刷新cout ,程序非正常终止也会刷新cout. 而写到cerr的数据是不缓冲的。写到clog的数据是被缓冲的,clog通常用于报告程序的执行信息,存入一个日志文件中
这里再来看std::cin和std::cout。前缀std指出名字cin,cout,endl是定义在名为std的命名空间中。标准库定义的所有名字都在命名空间std中。
麻烦的是什么呢?,通过命名空间使用标准库有副作用:当要使用标准库中的一个名字时,必须显式说明使用来自std命名空间的名字。如通过使用作用域运算符(::)指明想使用定义在命名空间std的名字cout--------std::cout
更简单的使用方法是在所有函数前面写上:using namespace std;
std::cin >> v1 >> v2;
输入运算符和输出运算符类似,接受一个isream作为左侧运算对象,接受一个对象作为其右侧运算对象,从给定的istream读入数据,并存入给定对象中。而且输入运算符返回其左侧运算对象作为其计算结果,所以可以写成:
std::cin >> v1;
std::cin >> v2;
注释和C语言一样,单行是//,多行是界定符对(/* 和 */),注释界定符不能嵌套。注释的最好的方式就是用 // 单行注释方式注释代码段中的每一行。
读取数量不定的输入数据
while (std::cin >> value)
当我们使用一个istream对象作为条件时,效果是检测流的状态。当遇到文件结束符或一个无效的输入时,istream对象的状态就会变成无效,处于无效状态的istream对象使条件变为假结束循环。(Windows下输入文件结束符是用Ctrl+z可以结束)
//统计在输入中每个值连续出现了几次
#include<iostream>
int main(){
//currval是我们正在统计的数,将读入的新值放入al中
int currval = 0, val = 0;
//读取第一个数,确保确实有数据可以处理
if(std::cin >> currval){
int cnt = 1; //保存正在处理的当前值的个数
while(std::cin >> val){ //读取剩下的数
if(val == currval){
++cnt; //值相同就将cnt加1
}
else{
std::cout << currval << "出现" << cnt <<"times" << std::endl; //否则打印前一个值的数
currval = val; //记住新值,并重置cnt
cnt = 1;
}
}
std::cout << currval << "出现" << cnt <<"times" << std::endl; //while循环截止,打印最后一个数的个数
}
return 0;
}
接下来是c++中很重要的一个概念:类。
我们可以通过定义一个类来定义自己的数据结构,一个类定义了一个类型以及相关联的一组操作。
每个类实际上都定义了一个新的类型,其类型名就是类名。标准库中如istream,ostream都是类。
Sales_item item
说明item是一个Sales_item类型的对象,或者说成“一个Sales_item对象”
item.isbn() //调用名为isbn的成员函数
成员函数是定义为类的一部分的函数,也称为方法。
我们可以使用(.)点运算符来表达,点运算符只能用于类类型的对象。左侧运算对象必须是一个类类型的对象,右侧运算对象必须是该类型的一个成员名。运算结果是右侧运算对象指定的成员。
使用()调用运算符来调用一个函数,括号里放实参列表(可能为空)。
最后注意未初始化变量,就是未赋予初值的变量,类类型的变量如果未指定初值,按类定义指定的方式进行初始化。定义在函数内的内置类型变量默认是不初始化的,除非有显式的初始化语句。