条款19 了解临时对象的来源
来源:互联网 发布:矩阵通解 编辑:程序博客网 时间:2024/04/30 06:00
只要你产生一个no-heap-object而没有为它命名,便产生了一个临时对象。
临时对象的产生途径:1.当隐式型别转换被施行起来以求函数能够调用成功。2.当函数返回对象的时候。
1.当隐式型别转换被施行起来以求函数能够调用成功
size_t countChar(const string& str,char ch){cout<<str;
//统计字符出现的个数,略掉return 1;}int main(void){ char buffer[20]; char c; cin>>c>>buffer; cout<<countChar(buffer,c);}
解释:利用char buffer[20]调用countChar(string& str,char ch),第一步先转化,构造一个string类型的临时对象,以buffer为自变量,调用string constructor,str就会绑定在临时对象上面。请注意,这边str是const string &类型,也就是不允许改变str的值,即绑定在该临时对象上面,读取临时对象的值,而没有改变临时对象的值,改变临时对象的值是没有意义的,临时对象会被销毁。
这样的转换很方便,但是从效率的角度视之,一个string临时对象的析构和构造,有其非必要的成本。
只有当对象以 by value(传值)方式传递,或是当对象被传递给一个reference-to-const(常引用)参数时,转换才会发生。当对象传递给一个reference-to-non-const参数,并不会发生此种转换。
<strong>size_t countChar( string& str,char ch)</strong>{cout<<str;return 1;}int main(void){ char buffer[20]; char c; cin>>c>>buffer; cout<<countChar(buffer,c);}
将上述的size_t countChar(const string& str,char ch) 修改为size_t countChar( string& str,char ch),编译立刻出错
error C2664: “countChar”: 不能将参数 1 从“char [20]”转换为“std::string &”。即无法进行类型转换。
理由,string& str 是 references-to-non-const ,如果编译器针对 references-to-non-const 对象进行隐式型别转换,会允许临时对象被改变。改变临时对象是没有意义的。references-to-const参数则不需要承担这一问题,因为此参数为const,无法改变其内容。
2.当函数返回对象的时候
const Number operator+(const Number& lhs,const Number& rhs)
此函数的返回值是个临时对象,因为它没有名称:它就是函数的返回值,如此而已,每当你调用operator+,便得为此付出构造和析构的成本。
结论:临时对象可能很耗成本,应该尽快消除,任何时候看到一个reference-to-const参数,就极可能会有一个临时对象被产生出来绑定至该参数身上。任何时候看到返回一个对象,就会产生临时对象。
- 条款19 了解临时对象的来源
- 条款十九:了解临时对象的来源
- 条款19了解临时对象的来源 练习
- 效率:条款19 了解临时对象的来源
- 19. 了解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- 临时对象的来源
- 临时对象的来源
- 临时对象的来源
- 了解临时对象的来源 (深刻理解为什么不能返回一个临时变量的引用)
- 理解临时对象的来源
- 理解临时对象的来源
- More Effective C++----(19)理解临时对象的来源
- 9.深刻理解临时对象的来源
- c++临时对象的来源即成本
- 理解临时对象的来源(More Effective C++_19(效率))
- More Effective C++ ——019_理解临时对象的来源
- GetParent与GetOwner的区别
- About PCA
- 第13周项目 4 冒泡输出
- 关于高仿微信对话列表滑动删除效果代码优化
- 单链表的Python实现
- 条款19 了解临时对象的来源
- 批量删除和复选框
- 女白领职场必看的15个忠告
- EQU
- 弹出层插件的编写-layer(跨iframe传值回调)
- 第七届中国R语言会议杭州会场开场致辞(阿里巴巴数据技术与产品部负责人闵万里)
- MFMessageComposeViewController 短信发送
- Android Intent 序列化和反序列化
- 【CodeForces 417D】【Cunning Gena】