第五、六章
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,即直接使用函数中的实参
5、main函数的实参
Int main(int argc, char * argv[]){ }
命令行窗口中输入dothat.exe,因此argc是1,数组argv有两个元素,argv[0]指向字符串“dothat.exe”,argv[1]包含空值。
法1:EXE
法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代码块中的语句执行后,循环依次进行下次迭代。