7.5 函数与结构体、共用体及类对象
前面已经讲过结构体和共用体的概念,结构体和共用体将数据整合为一个单独的实体。结构体变量、共用体变量以及后面要介绍的类对象,用法都接近于普通的变量,对结构体变量、共用体变量和类对象来说,函数支持其传值、传指针和传引用调用,同时,函数可返回结构体变量、共用体变量和类对象,也可返回指向这些变量的指针和引用。
下面以结构体来讨论使用方式,共用体和类对象与结构体在函数调用和返回的机制上是一致的。
7.5.1 3种参数调用
同其他变量一样,结构变量也可以作为函数的参数,请看代码7.16。
代码7.16 结构变量作函数的参数CallByStructVariable
<———————————-文件名:example716.cpp———————————————-> 01 #include<iostream> 02 #include<cmath>//使用计算平方根的函数sqrt需要此头文件 03 using namespace std; 04 struct Complex_Int//结构Complex_Int(整型复数)定义 05 { 06 int x; 07 int y; 08 }; 09 void print_CX(Complex_Int cx);//输出函数,值传递 10 double Calc_Abs(const Complex_Int&cx);//计算结构变量的模,引用传递 11 void Expand(Complex_Int*pCX,int n);//将pCX指向的结构变量扩大n倍,指针传递 12 int main() 13 { 14 Complex_Int cNum1={1,2};//声明Complex_Int型结构变量cNum1并对其初始化 15 int n=4; 16 cout<<"cNum1:"<<endl; 17 print_CX(cNum1);//调用输出函数 18 cout<<"cNum1的模是:"<<Calc_Abs(cNum1)<<endl;//调用求模函数 19 Expand(&cNum1,n);//调用放大函数 20 cout<<"放大4倍后:"<<endl; 21 print_CX(cNum1);//放大4倍后输出 22 return 0; 23 } 24 void print_CX(Complex_Int cx) 25 { 26 cout<<cx. x<<"+i*"<<cx.y<<endl; 27 } 28 double Calc_Abs(const Complex_Int&cx) 29 { 30 double res=sqrt((cx. xcx.x+cx.ycx.y));//平方和开根号 31 return res; 32 } 33 void Expand(Complex_Int*pCX,int n) 34 { 35 pCX->x*=n; 36 pCX->y*=n; 37 }
输出结果如下所示。
cNum1: 1+i*2 cNum1的模是:2.23607 放大4倍后: 4+i*8
【代码解析】分别演示了传值调用,传指针调用和传引用调用。首先声明了一个复数结构Complex_Int,在print_CX函数中采用了值传递,在函数内将生成实参的“复制品”,在以前写的函数中,参数多是像int,char之类的简单变量,这些变量占用的内存并不多,复制也快。
但结构、共用体以及后面要讲的类对象往往由多个成员变量组成,占用内存大,如果复制一份,会造成时间和空间双重浪费。采用指针传递和引用传递可有效解决这一问题,代码第33行,函数Expand用于将参数pCX指向的结构变量的x和y都扩大为原来的n倍,函数Calc_Abs则采用了引用传递的方式,同时,为了防止在Calc_Abs函数内对参数进行修改,采用了const修饰符,指明参数将被当做常量对待,编译器将不允许在当前函数内修改这个参数。