论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用
时间:2022-07-26
本文章向大家介绍论函数的设计应如何才好,返回临时变量 | 返回引用 | 传递引用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这个就涉及效率的问题,怎么要写,才会尽可能的少调用构造函数。
先设计如下的类
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);
所以,最终,我的结论是,需要处理,或者获得某个数据的时候,用传引用会更好。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot启动slf4j提示找不到weblogic.xml日志异常
- Angular 应用的DevDependencies
- 轻量级服务网格 - osm
- 漫画:设计模式之 “外观模式”
- 使用 Zotero 在 Markdown 中优雅处理参考文献
- Mybatis plus自动生成业务代码
- 功能强大的CD工具 - flagger
- Swift defer
- MySQL 最佳实践:CPU 100%,MySQL 到底在干什么
- 【译】Flutter 1.20 发布
- 算法面试题:一个List,要求删除里面的男生,不用Linq和Lamda,求各种解,并说明优缺点!
- Angular CLI创建的项目文件用途一栏
- [888]python内置函数vars()|dir()|locals()
- Mdnice,一种记录知识的新方式
- [887]python中@classmethod和@staticmethod