什么是临时对象?
C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象.
通常出现在以下两种情况:
(1)为了使函数调用成功而进行隐式类型转换的时候。
//计算字符ch在字符串str中出现的次数
int countChar (const string& str, char ch);
char buffer[];
char c;
//调用上面的函数
countChar (buffer, c);
传值方式:
int countChar (string str, char ch);
string buffer;
char c;
//参数通过传值方式传递
countChar (buffer, c);
传常量引用:
int countChar (string& str, char ch);
//声明一个将str中字符全部转化为大写
void toUpper (string& str);
char buffer[] = "hazirguo";
toUpper(buffer); //error!!非const引用传递参数不能完成隐式转化
(2)当函数返回对象的时候。
const string strMerge (const string s1, const string s2);
大多时候是无法避免这样的临时变量产生的,但是现代编译器可以将这样的临时变量进行优化掉,这样的优化策略中,有个所谓的“返回值优化”,下一篇具体讲解。
总结:
临时对象有构造和析构的成本,影响程序的效率,因此尽可能地消除它们。而更为重要的是很快地发现什么地方会生成临时对象:
- 当我们看到一个reference-to-const参数时,极可能一个临时对象绑定到该参数上;
- 当我们看到函数返回一个对象时,就会产生临时对象。