(转自: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
分享到:
相关推荐
(2) 使用对象指针实参仅将对象的地址值传给形参,而不进行副本的拷贝,这样可以提高运行效率,减少时空开销。 当形参是指向对象指针时,调用函数的对应实参应该是某个对象的地址值,一般使用&后加对象名。下面举...
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/C++程序为例讲述了程序运行效率的10个简单...一、尽量减少值传递,多用引用来传递参数。 至于其中的原因,相信大家也很清楚,如果参数是int等语言自定义的类型可能能性能的影响还不是很大,但是如果参数是一
最近忙毕业设计,关于图像处理一块的,本想用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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
前言 第1章文件结构 1.1 版权和版本的声明 ...11.1 使用const提高函数的健壮性 11.2 提高程序的效率 11.3 一些有益的建议 参考文献 附录A :C++/C代码审查表 附录B :C++/C试题 附录C :C++/C试题的答案与评分标准 前言
高质量C/C++编程指南.PDF 作者:林锐 目录: 前 言 第1章 文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第2章 程序的版式 2.1 空行 2.2 代码行 2.3 代码行内...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
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 指向成员的...
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 拷贝构造函数方法的...
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 拷贝构造函数方法的...
本来应该免费的,因个人...11.1 使用const提高函数的健壮性 82 11.2 提高程序的效率 84 11.3 一些有益的建议 85 参考文献 87 附录A :C++/C代码审查表 88 附录B :C++/C试题 93 附录C :C++/C试题的答案与评分标准 97