当产生一个non-heap object,而没有为它命名,便会产生了一个临时对象;
匿名对象通常发生于两种情况:
一是隐式类型转换被实施起来以求函数调用成功;
二是函数返回对象的时候。
发生于“传递某对象给一个函数,而其类型和它即将绑定上去的参数类型不同”的时候。
//返回ch在str中出现的次数
size_t countChar(const string& str,char ch);
char buffer[MAX_STRING_LEN];
char c;
//读入一个char和一个string,利用setw避免
//在读入string的时候产生缓冲区溢出的情况。
cin >> c >> setw(MAX_STRING_LEN) >> buffer;
cout << "There are" << countChar(buffer,c)
<< "occurrences of the character" << c_str
<<"in" << buffer <<endl;
调用countChar时,第一个自变量是一个char数组,但是函数参数确实const string& :
然而,以上转换,只有当对象以by value(传值)方式传递,或是当对象被传递给一个reference-to-const参数时,这些转换才会发生。如果对象被传递给一个reference-to-non-const参数,并不会发生此类转换,即如果把临时变量作为非const引用参数传递毫无意义。
//str中所有字符改成大写
void uppercasify(string& str);
char subtleBookPlug[] = "Effective C++";
uppercasify(subtleBookPlug); //错误!
const Number operator+(const Number& lhs,const Number& rhs);
这个函数返回值是个临时对象,因为它没有名称:它就是函数的返回值;
每次调用operator+需要为这个对象的构造和释放操作付出代价。
临时对象很耗成本,尽可能消除它们。
学会寻找临时对象的产生更重要:
在任何地方只要见到常量引用(reference-to-const)参数,就存在建立临时对象而绑定参数的可能。在任何时候只要见到函数返回对象,就会有一个临时对象被建立(然后被释放)。