C++组织大型程序的基本方法:
- 函数
- 数据结构
函数
- 定义时,先指定它的返回值类型,类型后是函数名,函数名后面用
()
括起的是参数列表,最后一部分是{}
括起的函数体。
参数
- 参数是函数中的局部变量,调用函数时他们被创建,函数返回时被销毁。
- 使用参数之前必须先定义,定义不会马上创建参数,在函数被调用时才会创建。
- 调用函数必须提供相应的参数,在函数开始执行时对参数进行初始化。
- 提供的参数对应于调用的函数所具有的参数,参数的顺序必须跟参数的相应顺序相同。
- 参数按值调用,参数获得的只是参数值的一个复制。
声明
一个函数在每一个使用它的源文件中被声明,函数仅仅被定义一次。
调用函数前必须先声明,每一个参数的类型都必须与相应的参数一致。
重载
同一个函数名可以定义多个函数——只要函数在参数的个数或类型上有差异。系统环境能够区分对同一个类型的引用和常量引用。
引用
- 引用
&
:是一个特定对象的另一个名称 const
+&
:确保不会对引用做任何可能改变它的值的动作。- 不存在一个引用的引用,定义一个引用的引用和原来对象的引用效果时一样的。
- 定义一个非常量的引用就不能指向一个常量对象或常量引用
clear
成员对于istream
表现的行为:清楚错误标记使得输入动作可以继续。
三种函数参数
- 参数无
const
无&
:函数的调用会复制参数,不改变参数的值 - 参数有
const
有&
:不复制对应的参数,同时不改变参数的值,提高程序效率。- 对
vector
或string
类型的参数复制耗费时间 - 对
int
或double
类的简单内部类型,复制非常快,额外开销较小,没有不要使用const
引用
- 对
值传递或与常量引用连接在一起的参数可以取任何值。
- 参数无
const
有&
:不复制参数,改变参数的值- 非常量引用参数对应的参数必须是左值,左值指示非临时对象的值,也可以是一个引用或返回一个引用的函数的调用结果
异常
- 程序抛出异常,这个程序就会在抛出异常的地方终止执行并转移到程序的另一部分,并向这部分提供一个异常对象(含有调用程序可以用来处理异常的信息)。
异常处理
try { // 代码,启动一个可能会引发异常的块语句
} catch (t) { // 代码 }
- 尝试执行
{}
中紧跟在try
关键字之后的语句,如果语句中的任何地方出现了t
异常,那么停止执行这些语句,转去执行另外一系列用{}
括起的语句,是catch
捕获子句的一部分。 catch
子句指示了所捕获的异常的类型。- 如果
try
和catch
之间的语句没有引发异常而正常结束的话,那么程序就跳过全部的catch
子句从而继续执行下一条语句。
throw e
:终止当前函数,将值e
传回给调用程序
demain_error
定义于头文件<stdexcept>
,报告-取值不能接受。- 创建一个待抛出
domain_error
对象时,可以给它一个字符串描述错误信息。 - 异常类:
logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
overflow error
underflow_error
e.what()
:返回一个值,报告问题所在。
一个时间上是跟在异常之后执行的运算,在程序正文中是没有必要位于异常发生的地点之后的。
在一条可能引发异常的语句中不应该出现任何其他的副作用,尤其是包含输入和输出的语句。
程序结构
头文件
#include <系统头文件>
#include "用户定义的头文件名称"
,有后缀.h
头文件中声明函数,用一个分号代替函数的函数体,还可以去掉参数的名称,把声明本身所用的名称都包含进去。
源文件中定义函数。
头文件中应该使用完整的限定名(标准库:std::
)而不是使用using
声明。
源文件中可以使用的using
声明。
预处理指令:
ifndef 变量
:检查 变量 是否被定义,如果特定的变量未定义,则ifndef
指令会请求预处理程序对在它和下一个匹配的#endif
之间的所有内容做出适当的处理动作。- 保证多次包含的动作是安全的,防止对头文件的重复包含,让每一个头文件都满足多次包含的要求。