您的位置:首页 > 编程语言 > C语言/C++

c++初学者指南 第九篇(4)

2010-09-20 23:59 127 查看
必备技能9.4:函数返回对象
和对象可以被作为参数传递给函数一样,函数还可以返回对象。在需要函数返回对象的时候,要声明函数的返回类型为对象的类类型,然后在函数中使用普通的return语句来返回该类的对象。下面的程序中,类的成员函数mkBigger()用于返回一个val值为调用该函数对象的val值2倍的对象。

//函数返回对象
#include <iostream>
using namespace std;
class MyClass
{
int val;
public:
//普通的构造函数
MyClass (int i)
{
val = i;
cout << "Inside constructor\n";
}
~MyClass()
{
cout << "Destructing\n";
}
int getval()
{
return val;
}
//返回对象
MyClass mkBigger()
{
MyClass o(val *2);
return o;
}
};
void display(MyClass ob)
{
cout << ob.getval() << '\n';
}
int main()
{
cout <<"Before constructing a. \n";
MyClass a(10);
cout <<"After constructing a. \n";
cout <<"Before call to display().\n";
display(a);
cout <<"After call to display().\n";
cout <<"Before call to mkBigger().\n";
a = a.mkBigger();
cout <<"after mkBigger() returns. \n";
cout <<"Before second call to display().\n";
display(a);
cout <<"After second call to display().\n";
return 0;
}

上面程序的输出如下:
Before constructing a.
Inside constructor
After constructing a.

Before call to display().
10
Destructing
After call to display().

Before call to mkBigger().
Inside constructor
Destructing
Destructing
after mkBigger() returns.

Before second call to display().
20
Destructing
After second call to display().
Destructing
在这个示例程序中,函数mkBigger()创建了一个局部的对象叫做o。它的val值是调用该函数的对象的val值的2倍。这个对象随后被返回,赋值给main()函数中的对象a。然后o被销毁,这就导致输出第一个”Destructing”信息被输出。但是第二次对析构函数的调用又是怎么回事呢?
当函数返回一个对象的时候,临时的对象会被自动创建。这个临时对象持有返回的值。函数返回的正是这个临时对象。在这个对象被返回后,它就会被销毁。这也正是在输出”After mkBigger() returns”之前输出了第二个”Desctructing”的原因。这个临时对象被销毁了。
和为函数传递对象一样,函数返回对象也存在这潜在的问题。这个临时对象的销毁可能引来同样的我们不希望的副作用。例如,如果返回对象的析构函数中释放了某些资源(诸如内存之类的),那么用该临时对象赋值的对象将持有的是无效的资源。对于这个问题的解决就要涉及到拷贝构造函数了。这个我们会在下面的小节中进行讨论。
最后一点:函数也是可以返回对对象的引用的。但是此时必须注意被返回引用的对象不能在函数结束的时候就超出了作用域。
练习:

1. 构造函数不能被重载,对吗?

2. 当为函数传递一个对象的时候,会生成该对象的一个副本。该副本会在函数返回的时候被销毁吗?

3. 当函数返回一个对象的时候,一个持有返回值的链式对象会被创建,对吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: