您的位置:首页 > 其它

对函数返回形式及传参方式的简单理解(实例)

2011-02-25 23:30 316 查看
函数可以返回值、引用和常量引用,其中返回常量引用与返回引用区别不大(惟一的区别就是前者返回结果是一个不能变化的对象引用)。

我们可以通过以下几个例子来理解返回值和返回引用的区别。

例1

#include "stdafx.h"
#include <iostream>

class A
{
public:
int v;
A(int v)
{
this->v = v;
}
};

A Func(A& a)
{
return a;
}

int _tmain(int argc, _TCHAR* argv[])
{
A a(1);
A& b = Func(a);
a.v = 2;
std::cout << "b: " << b.v << std::endl;
return 0;
}

输出结果 b: 1
函数返回一个值,该值会由形式参数复制到调用函数的环境中,因此改变a的值并不会影响b的值。

例2
#include "stdafx.h"
#include <iostream>

class A
{
public:
int v;
A(int v)
{
this->v = v;
}
};

A& Func(A& a)
{
return a;
}

int _tmain(int argc, _TCHAR* argv[])
{
A a(1);
A& b = Func(a);
a.v = 2;
std::cout << "b: " << b.v << std::endl;
return 0;
}


输出结果 b: 2
函数返回引用,返回的结果是指向形式参数的引用,因此改变a的值会同时反映的b上。

上面两个例子改变一下传参的方式,会有不同的输出结果

例3
#include "stdafx.h"
#include <iostream>

class A
{
public:
int v;
A(int v)
{
this->v = v;
}
};

A& Func(A a)
{
return a;
}

int _tmain(int argc, _TCHAR* argv[])
{
A a(1);
A& b = Func(a);
a.v = 2;
std::cout << "b: " << b.v << std::endl;
return 0;
}


输出结果 b: 273185728
如前一篇的函数传参一文中所述,在调用Func函数前会调用A的构造函数将实际参数拷贝到形式参数,调用函数结束时,会调用A的析构函数释放形式参数。由于函数返回形式参数的引用,而形式参数又被释放掉了,因此这里的输出结果不是1。

例4

#include "stdafx.h"
#include <iostream>

class A
{
public:
int v;
A(int v)
{
this->v = v;
}
};

A Func(A a)
{
return a;
}

int _tmain(int argc, _TCHAR* argv[])
{
A a(1);
A& b = Func(a);
a.v = 2;
std::cout << "b: " << b.v << std::endl;
return 0;
}


输出结果 b: 1
这里由于函数Func是返回值而不是引用,函数在返回时会把返回结果复制到调用函数的环境中,因此尽管形式参数会被释放掉,但对返回结果并没有影响,所以输出结果还是1。

初学C++,可能理解的不够到位,欢迎各位指正。有更好的例子也欢迎大家提出来讨论讨论,呵呵。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐