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