`
Joson_Coney
  • 浏览: 54891 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

c++中使用引用传递来提高效率

阅读更多

(转自:http://www.diybl.com/course/3_program/c++/cppjs/2008215/99861.html

 

我们写一个函数,比如 objclass fun(objclass obj); objclass是类名,obj是对象,fun是函数名。

然后调用此函数,编译器分两个步骤:

1.每次通过值传递的方式给函数传递一个对象时,都会建立一个该对象的拷贝。

2.每次通过值从函数返回一个对象时,也会建立另一个拷贝。

也就是说调用一次此函数,系统会自动建立两次的对象拷贝,然后再调用两次析构函数释放对象的拷贝。

我们知道当调用函数的时候,这些对象被复制到栈中,这样做会费时且占用内存,当使用用户定义的大对象时,这种拷贝带来的内存开销是非常显著的。当时用用户建立的类时,每次生成这种临时的拷贝都要调用一个特殊的构造函数:复制构造函数。当函数返回时,对象的临时拷贝被删除,此时需要调用对象的析构函数。如果返回对象时通过值传递的方式,那么必须建立对象的拷贝,然后再删除。对于很大的对象,调用构造函数和析构函数在速度和内存方面都会造成很大的开销。

为了说明这一点见下面的例子:

 

#include <cstdlib>
#include <iostream>

using namespace std;

class class_A
{
    public:
        class_A()
        {
            cout<<"class_A 构造函数..."<<endl;
        }
        class_A(class_A &)
        {
            cout<<"class_A 复制构造函数..."<<endl;
        }
        ~class_A()
        {
            cout<<"class_A 析构函数..."<<endl;
        }
};

 

//-------------------------------------------------------------------------------------------

 

class_A funOne(class_A obj);
class_A *funTwo(class_A *obj);

class_A funOne(class_A obj)
{
    cout<<"函数funOne返回..."<<endl;
    return obj;
}

class_A *funTwo(class_A *obj)
{
    cout<<"函数funTwo返回..."<<endl;
    return obj;
}

 

//-------------------------------------------------------------------------------------------

 

int main(int argc, char *argv[])
{
     //调用 class_A的构造函数 
   class_A abc;                      
     //-------------------------------------------------------------------------------------------
     cout<<"调用函数funOne..."<<endl;
     //1.采用值传递的方式传递 class_A类的对象,因此在栈中会建立一个对象的拷贝,作为
   //被调用函数的局部对象,这样就调用了复制构造函数。
   //2.当函数返回的时候,函数采取值传递的方式返回 class_A类的对象,这样又会建立对象
   //的另一个拷贝,再次调用复制构造函数。  
   funOne(abc);    
     //1.funOne()返回值不赋给任何对象,因此这个返回的临时值就被丢弃了,这时调用析构函数。 
   //2.funOne()结束之后,因此它的局部拷贝的作用域也随之结束和被删除,这时又一次调用了 
   //析构函数。 
   //-------------------------------------------------------------------------------------------
    cout<<"调用函数funTwo..."<<endl;
    //传递参数采用引用的方式,因此,没有对象进行拷贝,也就没有输出。 
   funTwo(&abc);
     //返回 class_A类的对象,由于这一次依然采用引用传递的方式,因此还是没有调用构造函数和析构函数。
   //-------------------------------------------------------------------------------------------
    system("PAUSE");
    return EXIT_SUCCESS;
}

 
 以上code可以直接复制使用~~


文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/c++/cppjs/2008215/99861.html

分享到:
评论

相关推荐

    C++对象和指针的引用

    (2) 使用对象指针实参仅将对象的地址值传给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时空开销。 当形参是指向对象指针时,调用函数的对应实参应该是某个对象的地址值,一般使用&后加对象名。下面举...

    提高编程效率的高质量的C~C++编程

    4.4 循环语句的效率... 29 4.5 for 语句的循环控制变量... 30 4.6 switch语句... 30 4.7 goto语句... 31 第5章 常量... 33 5.1 为什么需要常量... 33 5.2 const 与 #define的比较... 33 5.3 常量定义规则... ...

    提高C++程序运行效率的10个简单方法

    本文以C/C++程序为例讲述了程序运行效率的10个简单...一、尽量减少值传递,多用引用来传递参数。 至于其中的原因,相信大家也很清楚,如果参数是int等语言自定义的类型可能能性能的影响还不是很大,但是如果参数是一

    C++与C#混合项目示例(显示调用DLL)

    最近忙毕业设计,关于图像处理一块的,本想用C#做,或来发现C#处理图像效率较低,C++性能则较高,但若都改成C++工程量很大,便想到用C++和C#混合项目。网上也有这方面的介绍,但是都不全,特别是针对于二者关于多维...

    C++编程思想 例子和叙述讲解C++编程

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++编程思想 编程

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    免费下载:c++编程思想(中文)

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++编程思想.pdf

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    Thinking in C++高清版

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    c++ 编程思想 (高清pdf)

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++ 语言 详细教程电子版

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    新手必看编程法则C++

    前言 第1章文件结构 1.1 版权和版本的声明 ...11.1 使用const提高函数的健壮性 11.2 提高程序的效率 11.3 一些有益的建议 参考文献 附录A :C++/C代码审查表 附录B :C++/C试题 附录C :C++/C试题的答案与评分标准 前言

    高质量C++编程指南.PDF

    高质量C/C++编程指南.PDF 作者:林锐 目录: 前 言 第1章 文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第2章 程序的版式 2.1 空行 2.2 代码行 2.3 代码行内...

    C++ 编程思想 打印版 pdf

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++编程思想 PDF版 电子书

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    10.2 C++中的引用 10.2.1 函数中的引用 10.2.2 参数传递准则 10.3 拷贝构造函数 10.3.1 传值方式传递和返回 10.3.2 拷贝构造函数 10.3.3 缺省拷贝构造函数 10.3.4 拷贝构造函数方法的选择 10.4 指向成员的...

    C++编程思想 打印版 pdf

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    C++编程思想(用简单的例子和简练的叙述讲解C++编程)

    10.2 C++中的引用 176 10.2.1 函数中的引用 177 10.2.2 参数传递准则 178 10.3 拷贝构造函数 179 10.3.1 传值方式传递和返回 179 10.3.2 拷贝构造函数 182 10.3.3 缺省拷贝构造函数 187 10.3.4 拷贝构造函数方法的...

    绝对经典的C++编程资料

    本来应该免费的,因个人...11.1 使用const提高函数的健壮性 82 11.2 提高程序的效率 84 11.3 一些有益的建议 85 参考文献 87 附录A :C++/C代码审查表 88 附录B :C++/C试题 93 附录C :C++/C试题的答案与评分标准 97

Global site tag (gtag.js) - Google Analytics