函数在C++中的使用

  函数在C++中的使用,无非2种地方,一处是函数的定义,一处是函数的调用。而函数的定义则非常简单,由三个部分组成:函数的返回类型、函数名和函数的形参表。当然,这里不同的函数定义可以还会稍有不同,比如类的成员函数、内联函数等。这里我们主要讨论函数的调用时需要注意的一些问题。

  一、参数传递

  我们将函数定义或声明里的参数叫形参,而在调用函数时传入的参数叫实参。那么根据形参类型的不同,有几下形式的参数传递。

  1,非引用形参

  1)普通的内置类型

  普通非引用类型的参数通过复制对应的实参实现形参的初始化。当用实参的副本初始化形参时,函数并没有访问调用所传递的实参的本身,因此函数不可能改实参的值。比如下面的交换两个数的程序:

  void swap(int v1, int v2)

  {

  int temp = v1;

  v2 = v1;

  v1 = temp;

  }

  swap(a, b);// 调用swap

  上面程序中,实参为a与b,但是在调用时,v1与v2接受的是a与b的副本,所以实际上a与b的值没有变化。

  2)指针形参

  函数的形参可以是指针,此时将复制实参指针,其实这类跟1)原理类似,函数内并无法改变实参的指针值。只是函数可以通过复制到的地址改变实参指针所指向的值。

  void swap(int* v1, int* v2)

  {

  int temp = *v2;

  *v2 = *v1;

  *v1 = temp;

  }

  int main()

  {

  int a = 10,b = 20;

  int *p1 = &a,*p2 = &b;

  swap(p1,p2);

  return 0;

  }

  上面程序中定义的swap的形参为指针类型,main中调用swap,实际上swap并不能改变p1与p2的值,只是改变了它们所指向的值。

  3)const 形参

  对于普通的非引用类型用const修饰实际上是没有意义的,因为本来函数就不会改变实参的值。像下面的定义,实际中编译器会忽略const的定义,而将其视为int型。

  void fcn(const int i);

  2,引用形参

  1)在上面的程序中我们看到,如果想交换两个变量的值,通过调用普通的非引用类型形参的函数,并不能实现。用它们的指针可以,同时我们也可以用引用。

  void swap(int& v1, int& v2)

  {

  int temp = v2;

  v2 = v1;

  v1 = temp;

  }

  int main()

  {

  int a = 10,b = 20;

  swap(a,b);

  return 0;

  }

  在实际调用swap时,v1与v2实际相当于a与b的另一个名字。

  2)在有的时候我们需要向函数传递大型对象,需要使用引用形参,如果直接使用复制实参的形式可以,但是它的效率太低了,甚至有些对象是无法复制的。但是使用引用形参时,我们不希望函数改变了实参传入的值,我们就可以使用const来限定形参。下面程序用来判断哪个字符串更长,明显我们不希望函数会改变字符串的内容,我们就可以用const引用型的形参。

  bool isLonger(const string &s1, const string &s2)

  {

  return s1.size() > s2.size();

  }

  所以,如果使用引用形参的惟一的目的是避免复制实参时,则应将形参定义为const引用。

  3)在使用引用形参函数时,有两点值得注意:

  不要用const限定的实参或字面值来调用非const引用形参函数。因为这样函数内,可以改变实参的值,这不合法。

  非const引用形参只能与完全同类型的非const对象关联。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值