论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用

这个就涉及效率的问题,怎么要写,才会尽可能的少调用构造函数。

先设计如下的类

class tempTest{
public:
    tempTest(){
        cout <<"hello tempTest() "<<count++ << endl;
    }
    tempTest(tempTest& ){
        cout <<"hello copy tempTest() "<<count++ << endl;
    }
    ~tempTest(){
        cout << "good bye "<<count--<<endl;
    }
    tempTest& operator=(tempTest& r){
        cout <<"hello operator= "<<count++ << endl;
        return *this;
    }
private:
    static int count;
};
int tempTest::count = 0;

首先这个函数里面,会发生两次构造函数,一次是 变量t,另外一次是return 前,做的一次拷贝构造

tempTest testTemp(){
    tempTest t;
    return t;
}

第一种,返回临时变量,这里的话,就会再发生一次 tt 构造函数,接着再触发 operator=(assign),这样的话,如果是存有大数据的结构体的话,性能就很差了。

        cout << " tt = testTemp"<<endl;
        //这样写,就3次构造函数
        tempTest tt;
        tt = testTemp();

第二种,如果是这样写的话,就只有 testTemp() 函数里面的两次对象的产生! 比第一种少了两次。

        cout << "tempTest tt = testTemp"<<endl;
        //这样写,就2次构造函数
        tempTest tt2 = testTemp();

首先这个函数的话,只会发生一次构造函数,返回引用

tempTest& testTemp2(){
    tempTest * t = new tempTest();
    return *t;
}

第三种,然后,注意这里的变量要用引用,这样,总得来说,只发生一次构造函数!一次是最少了,但是如果返回引用的话,就得注意一个问题,内存泄露,所以不用得时候,要delete掉。返回指针同理。

        cout << "tempTest& tt = testTemp"<<endl;
        tempTest& tt3 = testTemp2();
        _CrtDumpMemoryLeaks();
        delete &tt3;

这个函数,就通过传入引用来修改变量。

void testTemp3(tempTest& t){

}

这样的话,只需要一次构造函数,然后,如果是临时变量的话,超过使用范围,还会自动析构,更方便的样子。

        cout << "testTemp3(tempTest&)"<<endl;
        tempTest tt4;
        testTemp3(tt4);

所以,最终,我的结论是,需要处理,或者获得某个数据的时候,用传引用会更好。

时间: 2024-10-10 20:45:46

论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用的相关文章

重构改善既有代码设计--重构手法02:Inline Method (内联函数)&amp; 03: Inline Temp(内联临时变量)

Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLateDeliverise() ? 2 : 1; } bool MoreThanfiveLateDeliverise() { return _numberOfLateLiveries > 5; } int GetRating() { return _numberOfLateLiveries > 5

C++函数返回引用、非引用以及临时变量的问题

C++中新增了引用类型,所以函数的返回值可以是引用类型.那么就会有人想问 返回引用类型与返回非引用类型有区别吗? 结论是显然的,而且有明显的区别.尤其初学者会很容易绕进去.让我们先看四个函数原型.以int类型来举例 (1) int fun(...) { return ....//后面跟的是一个引用 } 例如:int fun(int &a) { return a; } (2)int fun(...) { return....//后面跟的是一个非引用 } 例如:int  fun(int a) { r

函数设计应做到低耦合,高内聚

最近,同项目组的一位师姐请产假了,由我接手她之前的部分版本的开发工作.在开发的过程中,我阅读了某个很古老的版本的程序代码,心生感触,想在这里啰嗦几句. 该版本中很多函数的调用关系都错综复杂,让人读起来非常的费劲.我用如下的图来形象化地表示这种函数之间的调用关系. 箭头的指向为调用关系,如"函数A"调用了"函数B"."函数C"."函数D"."函数E"."函数F",以此类推. 当函数之间的调

系统构架设计应考虑的因素

系统构架设计应考虑的因素 摘要:本文从程序的运行时结构和源代码的组织结构两个方面探讨了系统构架设计应考虑的各种因素,列举了系统构架设计文档应考虑的一些问题. 关键字:系统构架.设计.考虑.因素 正文:约公元前25年,古罗马建筑师维特鲁威说:“理想的建筑师应该既是文学家又是数字家,他还应通晓历史,热衷于哲学研究,精通音乐,懂得医药知识,具有法学造诣,深谙天文学及天文计算.”(好难哪,软件构架设计师的要求呢?大家好好想想吧.) 本文目录一.与构架有关的几个基本概念: 二.构架设计应考虑的因素概揽:

二维地图上A*启发函数的设计探索

工作中需要优化A*算法,研究了一天,最后取得了不错的效果.看网上的朋友还没有相关的研究,特此记录一下.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leonhard-/p/6842052.html,这是对作者最起码的尊重,谢谢大家. 本文结构如下: 一.A*算法优化背景介绍 二.A*算法介绍与实现简述 三.深入思考优化需求 1.启发函数的设计思路 2.启发函数与cost值的相对关系 3.启发函数中对k值大小的深入思考 四.总结 一.A*算法优化背景介绍

受教了,memcache比较全面点的介绍,受益匪浅,适用memcached的业务场景有哪些?memcached的cache机制是怎样的?在设计应用时,可以通过Memcached缓存那些内容?

基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid -d选项是启动一个守护进程, -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, -u是运行Memcache的用户,我这里是root, -l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服

Effective c++(笔记) 之 类与函数的设计声明中常遇到的问题

1.当我们开始去敲代码的时候,想过这个问题么?怎么去设计一个类? 或者对于程序员来说,写代码真的就如同搬砖一样,每天都干的事情,但是我们是否曾想过,在c++的代码中怎么样去设计一个类?我觉得这个问题可比我们"搬砖"重要的多,大家说不是么? 这个答案在本博客中会细细道来,当我们设计一个类时,其实会出现很多问题,例如:我们是否应该在类中编写copy constructor 和assignment运算符(这个上篇博客中已说明),另外,我们是让编写的函数成为类的成员函数还是友元还是非成员函数,

第6课-函数库设计

1.Linux下的应用程序所需要的外部函数可以由函数可和系统调用提供.2.函数库是处于用户态的,由工作人员编写的函数的集合,而系统调用是由Linux内核实现的.3.函数库分为静态和动态,按照链接方式划分的.动态函数库比静态节约空间.使用静态函数库以后应用程序最终会包含自身和函数库,在内存中运行的时候就会有多个函数可的拷贝,导致在空间上的浪费.而动态函数库则在内存中只有一个拷贝,供多个都会使用到的程序使用.4.Linux使用的函数库一般都是在/lib或者在/usr/lib,以*.so*命名的,是动

3、函数——模块化设计

[1]概念 函数FUNCTION,每个函数用来实现一个特定的功能. [2]函数声明与定义 声明表示该函数存在,定义则表示该函数怎么去运行: [函数声明的作用是把有关函数的信息(函数名.函数类型.函数参数列表)通知编译系统,在调用时按照此进行检查] [函数定义是对函数功能的确定,是一个完整的.独立的函数单位] 在文件的开头(函数的外部)对要调用的函数进行声明,编译系统已从外部声明中知道了函数的有关信息,所以不必在主函数中重复进行声明. [3]函数调用 在声明一个函数的时候,参数是没有实际值的,只是