具体细节可以些简单的小程序进行测试
5.1 结构化程序设计方法->自顶向下,逐步细化
概要设计:自然语言描述/流程图-伪码描述->书面程序设计报告
->主调模块-被调模块设计过程中接口的设计(模块名称,输入参数,返回值)
模块化是团队分工的基础,模块接口是团队协作的基础,模块重用影响大型软件开发的组织与管理方式
->代码重用,包括跨时间段/跨项目/跨组织机构等;
通常模块以编译过的机器语言的形式提供给他人使用,其算法版权归设计者;
5.2 函数的定义和调用
主模块-子模块分割与定义;
函数定义->返回值类型 函数名(形式参数)
返回值类型不能为数组;形参实际上可以看成是预定义的,用于实现数据传输的本地变量
实际的模块接口就是指函数头部分;
->主模块,实现总体的参数输入和返回值->对计算机的接口,也就是可以认为计算机通过主模块实现对子模块集的调用;
函数调用->函数名(实参),实参按位置对应将变量值传递给形参;
->数据参数化:数据提取并以变量的形式表示,使代码具有重用性;
作为返回值的单一变量由于结构简单,可以省略return()的括号;
函数声明必须放在其调用语句之前,在主调函数定义之前进行定义的被调函数可以省略声明;
5.3 数据的管理策略(分散/集中)
数据分散管理部分:局部变量,其余函数不能直接访问->按需传递,也就是具有一个可传参数列表,主调函数和被调函数不能互相访问局部变量,而只能通过参数传递(形实结合)和返回值进行访问;对不同c文件则通过引用外部变量进行访问;
集中管理部分:全局变量;
->void的return语句可省;
->变量的局部和全局策略实际上取决于函数调用需求的参数传递效率等;
->变量的作用域/生存期还是需要列出分析的;
局部变量具有块作用域,全局变量具有文件作用域,不同文件需要使用外部调用形式;
5.4 程序代码和变量的存储原理
外存->内存副本->执行可执行文件
内存区包括:操作系统和其他程序、代码区、常量区、静态存储区(全局变量,程序加载后立即分配内存并保留到程序执行结束回收内存空间,采用静态分配方式)、自动存储区(栈)(存放局部变量/函数形参,由编译器为程序预留,有大小限制,同时存储对应语句块的返回地址以及CPU状态),加载时为空,执行时分配内存,执行结束代码块即被释放,采用自动分配)、堆;
->动态内存操作:new/delete,动态内存从空闲内存区域(堆)中调用内存空间,因此在函数调用后不会自动释放,需要手动回收内存;
->调用函数一般是通过函数名来调用,也可以通过函数指针
函数指针: 函数类型(*指针变量名)(参数列表)
p=fun1;(*p)=p=func1;
5.5 函数间参数传递的3种方式
值传递/引用传递/指针传递
->值传递只能将数据从主调函数传给被调函数,这是一种单向数据传递机制,实参可以采用可以作为右值的表达式;
->引用,双向数据传递,不能使用表达式;int &a; a=b;
->指针,要求实参为指针表达式,一般用于批量传递;int* a; a=&b;
->传递数组时被调函数需要定义数组形式的形参,同时还需传递表明数组大小的参数;int a[];a=b;/int a;a=b; 其中a[n]与[a+n]等价;
->二维数组, int a[][列数];
6.1 C++程序设计中的多文件结构
->函数不能跨文件定义,同一源文件中的函数统一编译,
.cpp->.obj->.exe;//CPU不同对应的.obj机器语言不同;
->多文件结构:外部函数/外部全局变量,都需要先声明再访问
->关键字: extern,对函数原型可以省略;
变量的引用必须使用关键字,且不能在引用的同时赋值;
->所有外部函数之间/外部全局变量之间/外部函数和全局变量不能重名;
->由于函数和全局变量默认是外部类型,对于仅限当前文件使用的全局函数/变量通过static关键字定义为静态函数/变量;
->静态局部变量作用是指采用静态内存,不会重复执行定义操作,因此对于全局和局部,static是多义词;
->头文件:自动复制的批量语句,习惯上头文件源文件一一对应;
6.2 编译预处理指令
->编译预处理指令,对编译器对本程序的编译进行设置,一般包括文件包含指令、宏定义指令和条件编译指令;
->在C++源程序中,每条指令单独写在一行,必须以”#”开头,不加结束符”;”编译时首先执行编译预处理指令;
->文件包含指令#include,
#include<>,标准目录检索(一般位于C++编译器的include文件目录)
#include””,首先在当前目录检索,如果没有指定文件,则在标准目录进行搜索;
->宏定义指令#define
宏定义指令作用是用一个标识符来表示一段代码文本(Macro),其中的标识符称为宏名,所表示的代码文本称为宏文本;
宏需要先定义再使用,习惯采用大写字母命名;
->C++提供3种形式的宏,无参宏/有参宏/空宏
->已经定义的宏可以用宏删除指令#undef删除;-
->无参宏,#define 宏名 宏文本,一般用于符号常量的定义;
->有参宏,#define AREA(x) 3.14159xx
#define 宏名(参数列表,多个参数之间以逗号隔开) 包含参数的表达式
有参宏在实参为表达式的情况下可能出现运算优先级的问题,因此在参数表达式中可以给对应参数补充"()";
->空宏,#define 宏名 空宏的作用是条件编译,例如头文件中常用的#ifndef
->条件编译指令
条件编译指令允许程序员将不同版本源代码编写在同一程序文件中,以便管理和维护;
条件编译指令(格式1)
#ifdef空宏名
代码段1//如果指定的空宏已定义,则执行代码段1
#else
代码段2//否则执行代码段2
#endif
->可以看成是if-else结构
条件编译指令(格式2)
#ifdef常量表达式
代码段1//若常量表达式为真,则编译代码段1
#else
代码段2//若没有代码段2,可以省略else
#endif
6.3 几种特殊形式的函数
->带默认形参值的函数,没有给出实参值则将默认形参值传递给对应的参数,默认值写在函数定义部分或声明部分;同一函数在相同作用域中只能指定一次默认值;
->在定义和声明阶段,必须将带默认值的形参定义在形参列表的后面;
->重载函数:同名不同参数的函数;
->内联函数:为了实现函数跳转和数据传递,计算机需要执行一些额外的操作,实现相同的功能时,单一函数程序要比多层调用执行速度更快,即函数跳转会降低效率;但函数是团队分工协作和代码重用的基础,可以提高开发效率;
内联函数在编译阶段直接嵌入到调用语句处;
通过在函数定义语句前增加inline关键字即可将其变成内联函数;
一般要求内联函数为频繁调用的简单函数;
-main()函数
有参形式:
int main(int argc,char* argv[]){}
其中argc存放参数个数(argc-1个),argv接收参数(argv[0]指向的字符数组存放的是该程序的文件名)
无参形式:
int main(){}
->VC++编译器对主函数语法的处理上存在差异,主要针对VC6.0和VS系列;VC6.0主函数可以没有返回值;VS新建文件向导可以自动插入头文件和基本架构(VS同时支持ANSI编码和Unicode的开发,以便于在不同编码方式间进行切换);