9.2 引用=指针>函数?

Posted: March 26, 2011 in C++

//问题:输入不同的2个数字,在2个函数中,进行相互转换.

#include <iostream>

void Function();void swap1(int x, int y);
void Pointer();void swap2(int *p1, int *p2);
void Reference();void swap3(int &rx, int &ry);

using namespace std;

void main()
{
            Function();
            Pointer();
            Reference();
}

/******************************************************/

/*
首先,我们讨论函数的缺点:
1.参数按值传递
2.返回语句只能返回一个值

这就使得这个问题无法解决,因为函数返回时只能返回一个值,所以要在2个函数中进行相互转换,
就只能在第一个函数中初始化,第二个函数中转换.
*/

void Function()
{
            int x=5,y=10;
            cout<<“x=”<<x<<” y=”<<y<<endl;
            swap1(x,y);
}
void swap1(int x, int y)
{
            int temp;
            temp=x;
            x=y;
            y=temp;
            cout<<“x=”<<x<<” y=”<<y<<endl<<endl;
}
/*这里体现出函数参数是局部变量,修改这些参数不会影响调用函数中的值,这被称为 按值传递.
这意味着将在函数中创建每个参数的局部副本,这些局部副本与其他局部变量一样.*/

/******************************************************/

/*
有没有什么方法能够解决函数的缺陷呢?
指针和引用为函数提供了好的解决办法.

接下来,介绍使用指针解决问题.
*/

void Pointer()
{
            int x=6,y=8;
            cout<<“x=”<<x<<” y=”<<y<<endl;
            swap2(&x,&y);
            cout<<“x=”<<x<<” y=”<<y<<endl<<endl;
}
void swap2(int *p1, int *p2)
{
            int temp;
            temp=*p1;
            *p1=*p2;
            *p2=temp;
}
/*这里*p1和*p2对应的就是x与y的内存地址,所以改变*p1和*p2的值,就等同于改变x与y的值
解决了按值传递的问题.并且在另一个函数中修改了原函数的值,”返回了2个值”*/

/******************************************************/

/*接下来,介绍使用引用解决问题.*/
void Reference()
{
            int x=9,y=6;
            cout<<“x=”<<x<<” y=”<<y<<endl;
            swap3(x,y);
            cout<<“x=”<<x<<” y=”<<y<<endl<<endl;
}
void swap3(int &rx, int &ry)
{
            int temp;
            temp=rx;
            rx=ry;
            ry=temp;
}
/*这里通过引用,等于为x和y取了个别名,在另一个函数中进行了转换,因而本身在原函数中也会发生改变.
解决了按值传递的问题.并且在另一个函数中修改了原函数的值,”返回了2个值”*/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s