临时对象会在两种情况发生:
1 调用函数发生隐式类型转换
size_t countChar(const string& str, char ch);
char buffer[MAX_STRING_LEN];
char c;
// read in a char and a string; use setw to avoid
// overflowing buffer when reading the string
cin >> c >> setw(MAX_STRING_LEN) >> buffer;
cout << "There are " << countChar(buffer, c)
<< " occurrences of the character " << c
<< " in " << buffer << endl;
为了消除const char*(buffer的类型)和 const string&(str的类型)之间的差别,需要创建一个临时的string类型的对象
void uppercasify(string& str);
char subtleBookPlug[] = "Effective C++"; uppercasify(subtleBookPlug); // error!
为什么函数调用失败呢?因为无法创建一个临时的string对象。
假设这里允许创建一个临时的string对象,str发生改变时,临时对象发生改变,
但字符串subtleBookPlug没有按照编程者意图发生改变。
但用const string& 就不会出现这个问题。
2 函数返回对象时
const Number operator+(const Number& lhs, const Number& rhs);
函数的返回值即是一个临时对象。
对于大多数函数,没有办法在概念上避免临时对象的构造函数和析构函数的调用,但通过现实中
一些优化方法可以解决这类问题。
具体的优化方法在下一章介绍。