第一章 预备知识
c语言编程原理
- 计算机语言要处理两个概念——数据+算法=程序
数据时程序使用和处理的信息,算法是程序使用的方法。 - 以前是属于过程性语言,会遇到组织方面的问题:例如程序经常使用分支语句,很多旧式程序的执行路径混乱,几乎不可能通过阅读程序来理解他,修改这种程序非常困难。
- 现在开发了一种有序的编程方法——结构化编程,例如:结构化编程将分支限制为一小组行为良好的结构(for、while等)
自顶向下的设计:将大型程序分解成小型、便于管理的任务。如果其中一项任然过大,则将他分解为更小的任务。
面向对象编程(oop)
- 强调数据,试图让语言满足问题的要求
- 在c++中,类——一种规范,它描述了这种新型数据格式
对象——根据这种规范构造的特定数据结构。 - oop首先设置类,准确表达程序要处理的东西,例如,绘图程序可能定义表示矩形、直线、圆的类,类定义描述了对每个类可执行的操作,如移动圆或旋转直线,然后便可以设计一个使用这个类的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫自下而上的编程。
- oop还有助于创建可重用的代码,这将减少大量的工作。
- 信息隐藏可以保护数据,使其免遭不适当的访问。
- 多态能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。
- 继承能够使用旧类派生出新类
c++和泛型编程
- 强调的是独立于特定数据类型,oop强调的是编程的数据方面。提供了执行常见任务的工具。
第二章 开始学习c++
#include <iostream>
int main()
{
using namespace std;
cout<<"Come up and C++ me some time";
cout<<endl;
cout<<"You won't regret it!"<<endl;
cin.get();
return 0;
}
-
作为接口的函数头
C++句法要求main()函数的定义以函数头int main()开始
c++可被其他函数激活或调用,函数头描述了函数和调用它的函数之间的接口。
int main()
也可以写作:int main(void)
void main() //省略返回语句
如果编译器到达main()函数末尾没有遇到返回函数,则认为main()函数以如下语句结尾:
return 0;
在运行c++程序时,通常从main()函数开始执行 -
c++注释
以双斜杠打头(//)
源代码的文件扩展名取决于所用的C++系统。在其他系统中,文件名可能为myfirst.C或myfirst.cxx。
应使用注释来说明程序。程序越复杂,注释的价值越大。注释不仅有助于其他人理解这些代码,也由有助于程序员自己理解代码。
c++也能够识别c注释,c注释包括在符号/*和 /之间,由于c风格注释/结束,而不是到行尾结束,因此可以跨越多行。 -
c++预处理器和iostream文件
如果程序要使用C++输入和输出工具,则需要这样两行代码:
#include
using namespace std;
可使用其他代码替换第二行
上述程序使用了#include 编译指令,该编译指令导致预处理器将iostream文件的内容添加到程序中。
为什么要把iostream文件添加到程序中?答案涉及程序与外部世界之间的通信。iostream中的io指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。c++的输入/输出方案涉及iostream文件中的多个定义。为了使用cout来发送消息,第一个程序需要这些定义。#include编译指令导致iostream文件中的内容随源代码文件的内容一起发送给编译器。原始文件没有被修改,而是将源代码文件和iostream组合成一个复合文件,编译的下一阶段将使用该文件。 -
头文件名
-
名称空间
如果使用iostream,而不是iostream.h,则应使用下面的名称空间编译指令来使iostream中的定义对程序可用:
using namespace std;
这叫做using编译指令。
名称空间旨在编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易。 -
使用cout进行C++输出
双括号括起的部分是要打印的消息,在C++中,用双括号括起的一系列字符叫做字符串。<<表示该语句把这个字符发送给cout;
endl 是一个特殊的c++符号,表示:重起一行。称为控制符。
\n 也可提供换行的功能,直接包含在字符串内。可减少输入量。c++语句
声明语句创建变量,赋值语句给变量提供另一个值。
//uses and displays a variable
#include <iostream>
int main()
{
using namespace std;
int carrots;
carrots=25;
cout<<"I have";
cout<<carrots;
cout<<"carrots.";
cout<<endl;
carrots=carrots-1;
cout<<"Crunch,crunch.Now I have "<<carrots<<"carrots."<<endl;
return 0;
}
- 声明语句和变量
int carrots;提供了两项信息:需要的内存以及该内存单元的名称。
c++的通常做法是,在首次使用变量前声明它。 - 赋值语句
c++可以连续使用赋值运算符:
int ste;
int bal;
int yam;
yam=bal=ste=88;
赋值将从右向左进行。 - cout的另一种用法
cout<<carrots;
首先,cout将carrots替换为当前值25,然后把值转换为合适的输出字符。
cout是可扩展的,可以重新定义<<运算符,使cout能够识别和显示所开发的新数据类型。
其他c++语句
- 使用cin
cin>>carrots;//信息流从cin流向carrots - 使用cout进行拼接
类简介
类描述了一种数据类型的全部属性(包括可使用它执行的操作),对象是根据这些描述创建的实体。
函数
c++函数分两种:有返回值的和没返回值的。
c++程序应当为程序中使用的每个函数提供原型。sqrt()的函数原型像这样:
double sqrt(double);
第一个double意味着sqrt()将返回一个double值。括号中的double意味着sqrt()需要一个double参数。
原型结尾的分号表明它是一条语句,这使得它是一个原型,而不是函数头。如果省略分号,编译器将把这行代码解释为一个函数头,并要求接着提供定义该函数的函数体:
在程序中使用sqrt()时,也必须提供原型,有两种实现方式:
1.在源代码文件中输入函数原型;
2.包含头文件cmath,其中定义了原型。
第二种方法更好,因为头文件更有可能使原型正确。
函数变体
有些函数不接受任何参数:
int rand(void);
还有一些函数没有返回值。例如函数,按美元、美分格式显示数字。当向他传递参数23,5时,它在屏幕上显示$23.50。由于这个函数把值发送给屏幕,而不是调用程序,因此不需要返回值:
void bucks(double);
用户定义的函数
int main()
开头的int表明,main()函数返回一个整数值,所以要在main()结尾使用下述语句:return 0;
但程序中没有对main()的调用,则返回值是去哪了?
可以讲计算机操作系统看做调用程序。main的返回值返给操作系统。
通常的约定是,退出值为0则意味着程序运行成功,非零则存在问题。
在多函数程序中使用using编译指令
只让需要访问名称空间的函数访问它是最好的选择。
有以下四种让程序访问名称空间的方法:
将 using namespace std;放在函数定义之前;
将using namespace std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素;
在特定的函数中使用类似 using std::cout;这样的编译指令,让该函数能够用使用指定的元素,如cout;
完全不使用编译指令using,而是使用前缀std::