条件语句与函数基础
charpter 5
- case 标签必须是整型常量表达式
- while 当不确定要迭代多少次时比较合适
continue 结束当次循环,continue后语句不执行
try – catch 异常处理
try{
执行程序;抛出异常
}
catch(异常){处理异常}抛出异常 throw 异常类型 表达式
throw runtime_error(“input must be int “) //这边抛出异常 类型为runtime_error 对象初始化为input must be int
常见异常
range_error 生成的结果超出值域范围
invalid_argument 无效参数
…
charpter 6
形参
- 函数返回类型不能是数组类型或者函数类型,可以是数组的指针或引用,或者是指向数组或函数的指针
- 局部静态对象 static 类型的变量 只初始化一次,直到main结束销毁,局部静态变量默认初始化为0;
- 传引用调用:形参是引用类型时,改变实参的值,实际是实参的别称。传值调用,形参和实参相互独立。
建议使用引用类型的形参来替代指针
注意:
使用引用 (当对象数据较大时,避免使用拷贝,例如string类型)
如果函数无需改变引用形参的值,声明为const 引用
使用引用形参,提供了一种返回多个对象的方法。
使用引用形参时,尽量使用常量引用数组形参
- 不允许拷贝数组以及使用数组时通常将其转换成指针。无法使用值传递,故而传递的是数组首元素的指针。即const int *,若需要改值,去掉const
- 由于传递的指针无法得知数组长度。一般使用
(const int *a, size_t size)
- 数组引用形参 举例
int (&arr)[10]
给这种形参赋值必须严格满足 多维数组形参 举例
int (*matrix)[10] <==> int matrix[][10]
表示指向含有10个整数的数组的指针(int matrix[][10],int rowsize) //10列 rowsize行
main(int argc, char **argv)
其中argc表示参数个数,使用参数时从argv[1]开始,argv[0]保存程序名,故而argc至少为1可变形参的函数 无法提前预知应该向函数传递几个实参 。若实参类型相同,可使用initializer_list标准库类型;类型不同,需编写可变参数模板。
initializer_list
list //该类型对象元素均为常量值
示例 int sum(initializer_listlist)
{int sum=0; for(auto beg=list.begin();beg !=list.end();++beg) sum += *beg; return sum;
}
sum({1,2,3}) ### 参数序列放在花括号内
返回类型及return语句
- void函数可使用return语句,程序执行到return时退出。
- 不要返回局部对象的引用或指针
tip
- 函数 返回值和返回引用是不同的
- 函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本。
- 返回引用函数return 不能返回临时变量或局部变量,返回参数可以
- 返回引用可以作为左值,即可赋值
string &shortString(string &data1,string &data2)
{return data1.size()>data2.size()? data1:data2;
}
int main(int argc,char **argv)
{
string a=”boy”;
string b=”girl”;
shortString(a,b)=”hello”;
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
- 返回数组指针 ? 形式为
Type (*function(参数))[dimension]
,如 int(*func(int i))[10] //表示调用的数组大小为10函数重载
- 重载函数,形参数量和形参类型必须有所不同
特殊用途语言特性
- 内联函数: 可避免函数调用的开销,适用于优化规模较小,流程直接,频繁调用的函数。用法 :
inline + 函数
- 调试帮助 assert 与NDEBUG
assert(expt)//表达式为假输出信息,并终止程序,为真则不处理
函数指针
函数指针指向的是函数而不是对象
bool (pf)(const string &s1,const string &s2) //pf指向一个函数,该函数参数是两个常字符串的引用,返回值为bool
bool pf(const string &s1,const string &s2) //声明一个名为pf的函数,返回值为bool *使用函数指针,直接将函数名赋给pf,例如
pf=lenthCompare
或者直接使用boo1 b1=pf("hello","compare");
- 函数指针形参 ,将函数指针作为形参,
例如 void useBigger(const string &s1,const string &s2,bool pf(const string &,const string &));使用时 useBigger(s1,s2,lenthCompare)
使用typedef 以及 decltype 简化表达式。
typedef bool (Func)(const string &,const string &)
typedef decltype(lenthCompare) *Func
void useBigger(const string &s1,const string &s2,Func)
附录
double add(double x,double y)
{
return x+y;
}double difference(double x,double y)
{
return x-y;
}double calculator(double (Fun)(double, double), double x,double y)
{
return (Fun)(x,y);
}int main(void)
{
double x=2;
double y=4;
double result1=calculator(add,x,y);
double result2=calculator(difference,x,y);//调用者只需面对唯一的接口:calculator
system(“pause”);
return 0;
}