EC笔记:第4部分:21、必须返回对象时,别返回引…
2018-06-17 23:25:42来源:未知 阅读 ()
使用应用可以大幅减少构造函数与析构函数的调用次数,但是引用不可以滥用。
如下:
struct St {
int a;
};
St &func(){
St t;
return t;
}
在返回t以后,t会被销毁,但是它的引用还在外面被使用,这样的操作是不可预料的。
那么,我们返回一个指针如何?
struct St {
int a;
};
St*& func(){
St *t=new St;
return t;
}
这样,从语法角度上来说没有问题,但是,在堆上分配的内存该有谁释放呢???
那么,再试试静态变量:
struct St {
int a;
};
St& func(){
static St t;
return t;
}
这样会存在什么问题呢?
问题就是,某些调用下可能得不到正确的结果:
例如我们对此程序做一下修改:
#include <iostream>
#include <cstdlib>
using namespace std;
struct St {
int a;
};
St& func(){
static St t;
t.a=rand();
return t;
}
int main(int argc, char *argv[]) {
St &t=func();
cout<<t.a<<endl;
func();
cout<<t.a<<endl;
}
输出的结果是:
41
18467
我们没有对t,使用赋值操作,但是t的值却变了。这是因为这里的t相当于一个全局变量,我们再次调用func()时,就会改变t的值。
那么看来只能返回值了:
struct St {
int a;
};
St func(){
St t;
t.a=rand();
return t;
}
但是这样并不好,会多次调用构造和析构函数。怎样做到效率高而且又正确呢?
struct St {
int a;
};
St func(){
return St{rand()};
}
编译器会我们省掉一些多余的构造函数与析构函数的调用。
什么时候该使用值传递?什么时候该使用引用传递?这主要取决于具体的需求。但是绝对不要返回一个局部变量的指针或引用,也不要返回一个局部静态变量的指针或引用。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- OpenCV开发笔记(五十九):红胖子8分钟带你深入了解分水岭 2020-05-24
- 算法笔记刷题6 ( PAT 1003我要通过 ) 2020-05-08
- C++基础 学习笔记六:复合类型之数组 2020-04-25
- C++基础 学习笔记五:重载之运算符重载 2020-04-23
- C++基础 学习笔记四:重载之函数重载 2020-04-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash