在C++中函数的研究

初学者往往会对函数这样的问题比较的困惑,比如说:函数的参数方法以及函数的返回类型.对于这些问题如果没有一个系统了解,务必会是更深层次学习的一个绊脚石.下面我就在C++中函数若干问题加以研究,希望各位学员能够有深层次的了解.
1.函数参数的传递方法.
我们知道函数具体实现的时候需要从主调函数传递参数到被调函数.这就需要在传递参数的时候做到类型的匹配.本人将函数的传递分为以下三种情况:
a.传递值
传递值的时候各位可以完全就将其看成是函数的实参部分对函数的形参部分一一对应的赋值,记住只是简单的赋值,而在主调函数中并不会对实参变量造成任何的影响.
举例:
class mySwap{
private:
int x,y;
public:
void swap(int x,int y){
int t;
t = x,x = y,y = t;
}
};
void main(){
int x=2,y=3;
mySwap s;
cout<<"before swap:x="<<x<<",y="<<y<<endl;
s.swap(x,y);
cout<<"after swap:x="<<x<<",y="<<y<<endl;
}

通过该实例我们可以看到在主调函数中的x,y并未受到影响,从另外一个角度讲swap函数和主函数中的x,y并不是占据着同一片内存空间.swap中x,y会随着swap函数并调用结束而完全被释放掉.
2.传地址
如果给子函数传递地址的话,其实从根本来看,我们传递的还是值,只不过是地址值罢了.此时我们会将主调函数中指待变量的内存空间的地址传递到子函数中.这个时候如果我们通过主调函数传递过来的地址来操纵内存空间的内容的话,也就实际上会改变我们在主调函数中的变量值.
举例:
class mySwap{
private:
int x,y;
public:
void swap(int *x,int *y){
int t;
t = *x,*x = *y,*y = t;
}
};
void main(){
int x=2,y=3;
mySwap s;
cout<<"before swap:x="<<x<<",y="<<y<<endl;
s.swap(&x,&y);
cout<<"after swap:x="<<x<<",y="<<y<<endl;
}

这个时候我们能够操作成功了.但是请不要误以为在swap函数中的x,y与主函数当中的相同..首先在swap中的x,y是指针类型的变量,当然他们也会随着被调用的结束而被销毁掉.此时的交换的成功,只是因为我将主函数中代表着x,y那两片空间的地址传递到了子函数.
3.传引用
这种传递的方法非常的巧妙与高效率,在传递的过程中会将我们主调函数当中变量的”绰号”当成实际的参数传递过程,而这个”绰号”恰好也能代表着主调函数中参数的那片空间.所以这时候我们的交换也会成功的.
class mySwap{
private:
int x,y;
public:
void swap(int &x,int &y){
int t;
t = x,x = y,y = t;
}
};
void main(){
int x=2,y=3;
mySwap s;
cout<<"before swap:x="<<x<<",y="<<y<<endl;
s.swap(x,y);
cout<<"after swap:x="<<x<<",y="<<y<<endl;
}


我们可以看到,通过这样的归纳总结我们会更加深刻的理解函数参数的传递方式,不但要掌握书写的形式,更重要的是了解他的实质.希望各位学院能够亲自去体验去体会下.
2.函数的返回类型
a.返回基本的数据类型
返回基本的数据类型无非有int,float,double,char…等等,如若不需要任何的返回类型我们可以使用void.比如,我们利用函数做两个数的加法,此时我们需要返回一个整形值,那么这个时候我们就可以使用int类型的函数.此时返回的时候我们的函数的名字也可以接受一个值,你也可以把函数就看成一个变量,他也有自己的空间,可以存储值,并且可以有赋值.但是在C中,我们的函数不能被赋值,即:sum(x,y) = x+y;(错误的).
class mySum{
private:
int x,y;
public:
int sum(int x,int y){
return x+y;
}

};
void main(){
mySum s;
int res,x=2,y=3;
res = s.sum(x,y);
cout<<"sum="<<res<<endl;

}
b.返回地址
如若要返回函数的地址,这个时候我们也需要一个指针变量来接受函数的返回值.如果我们要取得函数值所指向的那片空间的内容的话,我们同样是*(取内容)运算符.
举例
class mySum{
private:
int x,y;
public:
int* sum(int x,int y){
int sm=x+y;
return &(sm);
}

};
void main(){
mySum s;
int res,x=2,y=3;
res = *s.sum(x,y);
cout<<"sum="<<res<<endl;

}
需要注意的是,&运算符不允许有多个操作符,如&(x+y)是错误的.
c.返回引用
返回引用的时候要注意我们这个是把函数名的”绰号”传递给了另外一个变量名或者说引用类型的变量名.例如:int &res = s.sum(x,y)
class mySum{
private:
int x,y;
public:
int& sum(int x,int y){
int sm = x+y;
return sm;
}

};
void main(){
mySum s;
int res,x=2,y=3;
res = s.sum(x,y);
cout<<"sum="<<res<<endl;

}
d.返回实例对象
最后是在C++中所具有的特性了,我们可以以对象的形式返回.我们同样也可以得到该对象所包含的信息.
class mySum{
private:
int x,y;
public:
mySum(){}
mySum(int m):x(m){}
mySum sum(int x,int y){
int sm = x+y;
return mySum(sm);
}
void show(){
cout<<"sum="<<x<<endl;
}
};
void main(){
mySum s,res;
int x=2,y=3;
res = s.sum(x,y);
res.show();
}
此时返回的对象的时候,需要构造空间,因为在返回的时候需要一个带参数的构造函数,所以这个时候我们就不能使用系统提供的默认的构造函数.我们需要自己写两个构造函数.

总结了以上的内容,你是否对函数的认识更加深了一层.有什么问题可以给我E-MAIL
zhangxu@wuxi-weas.com
2007-1-22
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值