19項 テンポラリーオブジェクトの起源を理解する
テンポラリーオブジェクトの起源を理解する
テンポラリーオブジェクトとは、自動で作成される名前の無いオブジェクトのことです。
テンポラリーオブジェクトは、関数呼び出しのために暗黙の変換が行われるとき、関数がオブジェクトを返すときに起こります。
下の例では、関数呼び出しのための暗黙の変換が行われています。
unsigned int countChar(const string &str, char ch); char buffer[MAX_STRING_LEN]; cout << countChar(buffer, 'c');
countChar()を呼び出すとき、bufferによってstringが作られます。
なので、countChar(buffer, 'c')は下のように振る舞います。
countChar(string(buffer), 'c');
このような変換は、引数がオブジェクト型かconst参照型の時に起こります。
引数が非constの参照の時は、関数を呼び出せません。
unsigned int countChar(string &str, char ch); //const string &でない char buffer[MAX_STRING_LEN]; cout << countChar(buffer, 'c'); //呼び出せない
関数内部でテンポラリーオブジェクトのみが変更されるのを防ぐためです。
関数がオブジェクトを返すときにもテンポラリーオブジェクトは作られます。
const Number operator+(const Number &lhs, const Number &rhs);
この関数の戻り値はテンポラリーオブジェクトです。
テンポラリーオブジェクトはコスト高になる場合があるので、出来る限りなくすようにします。