C++ primer 学习笔记(四)

条件语句与函数基础

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_list list)
    {

    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;
}