随笔-60  评论-111  文章-0  trackbacks-0
只知道 一个函数 如果返回值是一个对象的话 肯定是要涉及到copy construct的 还会构造临时对象 那如果返回的是引用呢?
带着n多的疑问 写了下面的代码 来解惑

 1#include <iostream>
 2
 3class TestClass
 4{
 5private:
 6    static int cnt;
 7    int idx;
 8    int age;
 9public:
10    int GetAge(){return age;}
11    TestClass(int n)
12    {
13        idx=cnt;
14        cnt++;
15
16        age=n;
17        std::cout<<idx<<" TestClass(int n)"<<std::endl;
18    }

19    TestClass()
20    {
21        idx=cnt;
22        cnt++;
23
24        age=-1;
25        std::cout<<idx<<" TestClass()"<<std::endl;
26    }

27    TestClass(const TestClass& v)
28    {
29        idx=cnt;
30        cnt++;
31
32        age=v.age;
33        std::cout<<idx<<" TestClass(const TestClass& v)"<<std::endl;
34    }

35    ~TestClass()
36    {
37        std::cout<<idx<<" ~TestClass()"<<std::endl;
38    }

39    const TestClass& operator= (const TestClass& v)
40    {
41        age=v.age;
42        std::cout<<idx<<" operator="<<std::endl;
43        return *this;
44    }

45}
;
46
47int TestClass::cnt=0;
48
49TestClass Get()
50{
51    TestClass l(1);
52    return l;
53}

54
55TestClass Get2()
56{
57    return TestClass(2);
58}

59
60TestClass& Get3()
61{
62    TestClass l(3);
63    return l;
64}

65
66TestClass& Get4()
67{
68    return TestClass(4);
69}

70
71void test(void)
72{
73    TestClass t;
74    std::cout<<"\t0"<<"\tAge="<<t.GetAge()<<std::endl;
75    t=Get();
76    std::cout<<"\t1"<<"\tAge="<<t.GetAge()<<std::endl;
77    t=Get2();
78    std::cout<<"\t2"<<"\tAge="<<t.GetAge()<<std::endl;
79    t=Get3();
80    std::cout<<"\t3"<<"\tAge="<<t.GetAge()<<std::endl;
81    t=Get4();
82    std::cout<<"\t4"<<"\tAge="<<t.GetAge()<<std::endl;
83}

84
85int main(int argc, char* argv[])
86{
87    test();
88    system("pause");
89    return 0;
90}

91

代码输出是这样的


显然Get3&Get4是不能得到正确的结果的,因为函数返回时,局部对象的生存期就结束了,是对象的话就被解构了,所以返回的引用也不能对应正确的对象

Get2比Get少构造一个对象,当计算不是很复杂时Get2显然是最高效滴
posted on 2006-09-05 03:08 shaker(太子) 阅读(562) 评论(3)  编辑 收藏 引用 所属分类: C++

评论:
# re: 函数返回对象各种方法,怎样才是最高效? 2006-09-05 17:50 | chenger
现在的编译器都实现了返回值优化,一定程度上能减少拷贝次数  回复  更多评论
  
# re: 函数返回对象各种方法,怎样才是最高效? 2006-09-05 17:54 | 周星星
“ 一个函数 如果返回值是一个对象的话 肯定是要涉及到copy construct的 还会构造临时对象”
------ 在google上搜索一下 rvo 和 nrvo,或者直接看C++标准文档,不过那花费时间:)  回复  更多评论
  
# re: 函数返回对象各种方法,怎样才是最高效? 2006-09-06 03:24 | shaker
谢谢指点  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理