从零开始学习C++之C++的初步认识(第一天)
个人主要参考谭浩强老师的C++程序设计
1.从C到C++
C语言在1927年由美国贝尔实验室研制成功。随着计算机在工作中的流行,C语言也随之成为最受欢迎的计算机语言之一。但是工作中,人们发现C语言在解决大型难题时,用C语言写程序太难。
因此,1985年美国贝尔实验室在C语言的基础上研发出C++。初代C++与C语言相比,主要体现在增加了面向对象程序设计的“类”(class),因此最初C++被其创始人称为“带类的C”,后来,为了强调他是C的增强版,用C语言的自家运算符“++”,改称为C++。
2.最简单的C++程序
//两个斜杠是解释说明的符号,从//开始到这一行的最后,这些东西不会进入电脑让电脑看
#include<isotream> //这个不是C++的语句,而是他的一个预处理指令。
using namespace std;//他的意思是“使用命名空间std”
//C++标准库里的类和函数是在这里声明的
int main()//主函数由main这个名字和{}里面的C++语句构成
{
cout<<"C++,我TM来了";//cout语句,作用是把“”里的东西显示在电脑上
//cout=c+out,cout是C++自带的对象名,称为输出流对象
//"<<"是“插入运算符,与cout配合使用
return 0;//函数结束返回0
}
2.1
程序的第1行“ #include《isotream》”,这不是C++的语句,而是C++的一个预处理指令,它以“#”开头以与C++语句相区别,行的末尾没有分号。“#include < iostream >”是一个“包含指令”,它的作用是将文件“iostream”的内容包含到该命令所在的程序文件中,代替该指令。文件iostream 的作用是向程序提供输入或输出时所需要的一些信息。iostream 是 i-o-stream 3个词的组合,从它的形式就可以知道它代表“输入输出流”的意思,由于这类文件都放在程序单元的开头,所以称为“头文件”(header file)。在程序进行编译时,先对所有的预处理命令进行处理,将头文件的具体内容代替#include 指令,然后再对该程序单元进行整体编译。
2.2
程序的第2行“using namespace std;”的意思是“使用命名空间std″。C++标准库中的类和函数是在命名空间 std中声明的,因此程序中如果需要用到C++标准库(此时需要用#include 指令),就需要用“using namespace std;”作声明,表示要用到命名空间std中的内容。
2.3
程序中的第3行,其中用 main 代表“主函数”的名字。每一个C++程序都必须有一个 main 函数。main 前面的int 的作用是声明函数的类型为整型(标准C+ 规定main 函数必须声明为int 型.即此主函数返回一个整型的函数值)。程序第6行(return 0;)的作用是向操作系统返回一个零值。如果程序不能正常执行,则会自动向操作系统返回一个非零值,一般为-1
2.4
函数体是由大括号{ }上括起来的。本例中主函数内有一个以 cout 开头的语句。cout是由c和out 两个单词组成,顾名思义,它是C+用于输出的语向。cout 实际上是C++系统定义的对象名,称为输出流对象。我们把用"cout"和“<<”实现输出的语句简称为 cout 语句。“<<”是“插人运算符”,与cout 配合使用,在本例中它的作用是将运算“<<”右侧的英语双引号里的内容“C++,我TM来了”插入到输出的队列cout中(输出的队列也称作“输出流”),C++系统将输出流 cout的内容输出到系统指定的设备(一般为显示器)中。注意C++所有语句最后都应当有一个分号。
3. C++程序的构成和实现
3.1 一个C++程序可以由一个程序单位或多个程序单位构成
每一个程序单位作为一个文件。在程序编译时,编译系统分别对各个文件进行编译,因此,一个文件是一个编译单位。
3.2 在一个程序单位里有三部分
(1) 预处理指令。第一程序中就包括#include 指令
(2)全局声明部分(在函数外的声明部分)。在这部分中包括对用户自己定义的数据类型的声明和程序中所用到的变量的定义。
(3)函数:函数是实现操作的部分,因此函数是程序中必须有的和最基本的组成部分。每一个程定必须有一个或多个函数,其中必须有一个(而且只能有一个)主函数(main函数)。有的程序可以没有函数。
3.3 一个函数由两部分组成
(1)函数首部,即是函数的第一行。包括函数名、函数类型、函数属性、函数参数名、参数类型。
(2) 函数体 ,即函数首部下面的大括号内的部分。如果在一个函数中有多个大括号,则最外层的一对{ }为函数体的范围。
函数体一般包版:
(a)局部声明部分(在函数内的声明部分)。 包括对本函数中近用到的类型、函数的声明和变量的定义。对数据的声明既可以放在函数之外(其作用范围是全局的),也可以放在函数内(其作用范围是局部的,只在本函数内有效)。
(b)执行部分。由若干个执行语句组成,用来进行有关的操作,以实现函数的功能。
3.4 语句包括两类
(1)类是声明透句,如“int a, b.“用来向编译系统通知某些信息(如类型、函数和变量的声明或定义),但它并不引起实际的操作,是非执行语句。
(2)另一类是执行语句,用来实现用户指定的操作。C++对每一种语句赋予一种特定的功能。语句是实现操作的基本成分,显然,没有语句的函数是没有意义的。C++语句必须以分号结束,如“c=a+b;”,分号是语句的一个组成部分,没有分号的就不是语句。
3.5 一个C++程序总是从main函数开始执行的
不论main 函数在整个程序中的位置如何(main 函数可以放在程序文件的最前头,也可以放在程序文件的最后,或在一些函数之前,在另一些函数之后)。
3.6 类(class)是C++新增加的主要数据结构
#include<iostream> //预处理指令
using namespace std;
class Student{ //声明一个类,命名为Student
private: //以下是类的私有部分
int num; //私有变量
int score; //私有变量
public: //以下为类的公有部分
void setdate(){ //定义一个公有函数
cint>>num; //输入num的值
cin>>scorce; //输入score的值
}
void display(){ //定义公有函数display
cout>>"num="<<num<<endl; //输出num的值
cout>>"score="<<score<<endl; //输出score的值
};
}; //类的声明结束
Student stud1,stud2; //定义stud1和stud2为Student类的变量,称为对象
int main(){ //主函数的首部
stud1.setdate(); //调用函数
stud2.setdate();
stud1.display();
stud2.display();
return 0; //结束程序
}
这是一个包含类的最简单的C++程序。程序第3~16行声明一个类 Student.在一个类中包含两种成员:数据(如变量 nuim,score)和函数(如 setdata 函数和 display 函数),分别称为数据成员和成员函数。在C++中把一组数据和有权调用这些数据的函数封装在一起,组成一种称为“类(class)”的数据结构。在上面的程序中,数据成员 num, score 和成员函数 setdata, display组成了一个名为 Student的“类”类型。成员函数是用来对数据成员进行操作的。也就是说,一个类是由一批数据以及对其操作的函数组成的。
类可以体现数据的封装性和信息隐藏。在上面的程序中,在声明 Student 类时,把类中的数据和函数分为两大类:private(私有的)和 public(公用的)。把全部数据(num, score)指定为私有的,把全部函数(setdata, display)指定为公用的。当然也可以把一部分数据和函数指定为私有,把另一部分数据和函数指定为公用,这完全根据需要而定。在大多数情况下, 都把所有数据指定为私有,以实现信息隐蔽。
凡是被指定为公用的数据或函数,既可以被本类中的成员函数调用,也可以被类外的
语句所调用。被指定为私有的成员(两数或数据)只能被本类中的成员函数所调用,而不能被类以外的语句调用(除了“友元类”成员以外)。这样做的目的是对某些数据进行保护,只有被指定的本类中的成员函数才能调用它们,拒绝其他无关的部分调用它们,以防止误调用。这样才能真正实现封装的目的(把有关的数据与操作组成一个单位,与外界相对隔离),信息隐蔽是C++的一大特点。
可以看到:在类 Student中,有两个公用的成员函数 setdata 和 displayo setdata 函数的作用是给本类中的私有数据 num 和 score 赋以确定的值,这是通过cin语句实现的;在程序运行时从键盘输人 num 和 score 的值。display函数的作用是输出已被赋值的变量 num 和 score的值。由于这两个函数写私有数据 num 和 score 是属于同一个类 Student的,因此函数可以直接引用 num, 和 score。
第9和10行是输人语句, cin是c和n两单词的组合,与cout类似,cin是C共系统定义的输入流对象。“>>”是“提取运算符”,与cin配合使用,其作用是从输入设备电(如键盘)提取数据送到输入流 cin 中。我们把用cin和“>>”实现输人的语句简称为cin语句)在执行程序中的cin语句时,从键盘输入的第一个数据赋给整型变量num,输入的第2个数据赋给整型变量score。
程序中第 17 行“Student studl, stud2”是一个定义语句,它的作用是将 studl 和stud2 定义为 Student类型的变量,这种定义方法和定义整型变量(int a, b;)的方法是一-样的。区别只在于int是系统已预先定义好的标准数据类型,而 Student 是用户自己声明(指定)的类型。Student类与int, float等一样都是C++的合法类型。具有“类”类型特征的变量称为“对象”(object)。 studl 和 stud2 是Student类型的对象。和其他变量一样,对象是占实际存储空间的,而类型并不占实际存储空间,它只是给出一种“模型”, 供用户定义实际的对象。在用 Student 定义了 stud1 和 stud2 以后,这两个对象具有同样的结构和特性。
程序中第18~24行是主函数。“在主函数中有5个语句,其中前4个语句的作用是调用对象的成员函数。主函数中使用了两个对象 stud1 和 stud2, 因此在类外调用成员函数时不能只写函数(“setdata();”),而必须说明要调用哪一个对象的丽数,准备给哪一个对象中的变量赋值。因此要用对象的名字加以限定。
其中,“.”是一个“成员运算符”,把对象和成员连接起来。studl. setdata().表示调用对象studl 的 setdata 成员函数,在执行此函数中的cin语句时,从键盘输入的值(假设为 1001 和98.5)送给 studl 对象的 num 和 score, 作为学生1(studl)的学号和成绩。stud2. setdata()表示调用对象 stud2 中的setdata成员函数,在执行此函数中的cin语句时,从键盘输入的值(假设为1002和76.5) 送给 stud2对象的num 和score, 作为学生2(stud2)的学号和成绩。
3.7 C++书写格式自由
一行内可以写几个语句,一个语句可以分写在多行上。一般情况下,提倡一行写一个语句,以使程序清晰。
3.8 一个好的,有用的程序应该适当加上必要的注释,让人看懂
(1)//这是一种注释方法
(2)/*这是另一种注释方法*/