条款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参数,就极可能会有一个临时对象被产生出来绑定至该参数身上。任何时候看到返回一个对象,就会产生临时对象。



0 0
原创粉丝点击