各种传递 函数指针 异常

第五、六章

1、按值传递:

函数中不可以访问原始的实参,只能访问副本

2、给函数传递指针实参:

也是访问副本,但副本仍然指向相同的变量

Int *pnum=&num

故将pnum传递出去,也会相应改变num的值

3、给函数传递数组

也是按值传递,但是编译器将数组名转换为指针,该指针的副本被按值传递给函数(因此数组是唯一不能按值传递的类型)

声明时:double average(double array[], int count),函数体中使用sum+=array[i]

也可以使用double average(double*array, int count),函数体中使用sum+=*array++。两种只是函数体形式不一样,函数调用的形式一样。

调用时,average( values,(sizeof values)/(sizeof values[0]) );其中values是数组名

注:若是二维数组的话,传递的是指向一行的地址值

4、给函数传递引用实参

Int incr10(int&  num)

函数的形参num初始化为实参的地址,因此函数中只要使用形参num,即直接使用函数中的实参

5main函数的实参

Int main(int argc, char * argv[]){ }

命令行窗口中输入dothat.exe,因此argc1,数组argv有两个元素,argv[0]指向字符串“dothat.exe,argv[1]包含空值。

1EXE

2:工程-属性-配置属性-编译:输入数据

6、从函数返回值

1)返回指针:永远不要从函数中返回局部自动变量的地址,因为改局部自动变量在函数退出时被销毁,当初的地址不再指向该变量,可以用new解决

double* treble(double data)

{

Double* result=new double 0.0;

Return result

}

这样主程序中就可以使用返回指针:

double* ptr=nullptr;

ptr=treble(5.0);

delete ptr;

2)返回引用:

Double&  lowest()

{

Return a[j];  //返回的是a[j]的引用,而不是该元素的值,必须确保其引用的对象在函数执行完之后仍然存在!

}

主函数中可以使用:lowest()=6;将返回引用的元素值改为6

也可以左右两边都用:lowest(x.lenx)=2.0*lowest(y,leny)

若写成:return &a[j],则报错:error c2440:’return’:cannot convert from ‘double *’ to ‘double &’

零碎:

左值:可以放在=左边,可以被赋值

右值:不可以放在=左边,不可以被赋值

a=1 b=10

a,  b都是左值,a+b返回临时对象,是右值,不能b+c=x

具有右值引用形参的函数只能被右值实参引用

 

函数指针

1

double (*pfun)(char *,int)声明一个指针,指向接受两个类型为char *int的实参。返回值类型为double的函数

对比:double* pfun(char*,int)有两个形参,并返回double类型指针的函数的原型

赋值:double (*pfun)(char *,int)=sum或者pfun=sum(和变量的指针一样,调用函数前一定要初始化函数指针)

2、函数指针作为实参

指针在不同的环境中可以指向不同的函数,这使得从某个函数内部调用的具体函数可以由主调程序决定。这种情况下,可以显示传递函数名作为实参。例如某些情况下,该函数应该产生数组中所有数的平方和,其他情况下,它应该计算所有数的立方和。

 

省略函数实参:

现有showit函数定义如下:

Void showit(const char message[]){

cout<<endl<<message;

return;

}

现在有

Void showit(const char message[]=”something is wong”);

int main(){

 

const char mymess=”I loveyou”;

showit();//省略参数只能从右向左省略

showit(mymess);//

showit(“something is terrible”;)//

}

异常

Try

{

      if(0 ==predominantlycount[i])

       throw "故障";//throw语句的操作数决定着异常的类型,这里是字符串字面值,即const char[];也可以在try代码块调用的函数中抛出异常

         

}

     catch(constchar amessage[])

{

 cout<<amessage;

 }

Try代码块是以正常的顺序执行的,该代码块用来确定异常可能出现的位置。当执行throw语句时,控制权立即传递给catch代码块中的第一条语句,在catch代码块中的语句执行后,循环依次进行下次迭代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值