现在的位置: 首页 > 综合 > 正文

C++函数参数传递和返回值

2013年08月31日 ⁄ 综合 ⁄ 共 2228字 ⁄ 字号 评论关闭

1、函数的参数传递
1.1函数调用的机制
   函数的调用过程实际是对栈空间的操作过程(先进后出)。因为调用函数是用栈空间来保存信息的。函数调用过程大致描述如下:
1)建立被调用函数的栈空间;
2)保存调用函数的运行状态和返回地址;
3)传递函数参给形参;
4)执行被调用函数的函数体内语句;
5)将控制权或返回值交给调用函数。

存放函数的栈区是相互独立的。函数之间只能通过参数传递、返回值或其他方式进行数据传递。

函数在返回时,如果有返回值,可将它保存在临时变量中。然后恢复调用函数的运行状态。释放被调用函数的栈空间,按其返回地址返回到调用函数。
(为什么类传递时,构造、析构,特别注意)

#include <iostream>
using namespace std;
void(int a,int b);
void main()
{
int x=5,y=10;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
}
void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}

1、2函数的传值调用
swap()和main()的栈区是相互独立的。在main()中不能访问swap()中的局部变量a,b,和t.在被调用函数中,改变了形参的值,而不能改变调用函数实参值。这就是C++函数的参数传值调用的特性。
1.3函数的传址调用

址调用:是将实参的地址值传递给形参,这时形参应是指针,即让形参指针指向实参地址,这里不再是将实参拷贝一个副本给形参,而是让形参直接指向实参。于
是,这就提供了一种可以改变实参变量值的方法:在被调用函数中改变形参所指向的变量值。这便是传址调用的特点,它与传值调用的特点。
#include <iostream>
using namespace std;
void(int *a,int *b);
void main()
{
int x=5,y=10;
cout<<"x="<<x<<"y="<<y<<endl;
swap(&x,&y);
cout<<"x="<<x<<"y="<<y<<endl;
}
void swap(int *a,int *b)
{
int t;
t=a;
a=b;
b=t;
}

 


1、4函数的引用调用
  

使用引用作函数参数时,要求实参变量名,将实参变量名赋给形参引用,即形参实际上成了实参的别名。引用起到了传了传址调用的作用,即不仅可以不传递实参的
副本,还可以在被调用函数中参通过形参改变实参值。在引用调用中,实参直接用变量名,形参用引用名,免去使用指针带来的麻烦。因此,使用引用调用比传址调
用更为简单,并且可读性好。所以,在C++语言中,较多地使用引用调用来替代传址调用,以简捷的方式达到了传址调用的效果。
#include <iostream>
using namespace std;
void(int &a,int &b);
void main()
{
int x=5,y=10;
cout<<"x="<<x<<"y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<"y="<<y<<endl;
}
void swap(int &a,int &b)
{
int t;
t=a;
a=b;
b=t;
}

2、函数的返回值
2.1值返回
  在带有返回值的函数中,需要使用return语句返回一个表达式的值,如:return 表达式;一般函数返回值时都要建立临时变量,即用来拷贝副本。

2、2引用返回
引用返回值时,不产生值的副本,而是将其返回值直接传递给接收函数返回值的变量或对象。

#include <iostream>
using namespace std;
class INCREASE
{
   public:
    INCREASE (int x=0):value(x){}
    INCREASE &operator++(int);
     void display();
    private:
       int value;
};
INCREASE &INCREASE::operator++(int)
{
  value++;
  return *this;
}
void INCREASE::display()
{
 cout<<value<<endl;
 return;
}
void main()
{
  INCREASE a(100),b;
  b=a++;
  b.display();
}

 

 

对象引用调用

#include <iostream>
using namespace std;
class Animal
{
public:
Animal(){cout<<"Animal./n";}
void eat(){cout<<"eat./n";}
virtual void take(){eat();}
  ~Animal(){cout<<"delAnimal./n";}
};
class Giraffe:public Animal
{
 
public:
 Giraffe(){cout<<"Giraffe./n";}
    void StretchNeck(){ cout<<"stretch neck,/n";}
 virtual void take(){eat();}
  ~Giraffe(){cout<<"delGiraffe./n";}
};
void Func(Animal &an)
  {
    an.take();
   }
void main()
{
 
  Giraffe gir;
  gir.StretchNeck();
  Func(gir);
  gir.StretchNeck();
}

抱歉!评论已关闭.