// в этой функции определение переменной encrypted отложено до момента,
// когда в ней возникает надобность, но и этот вариант еще недостаточно
// эффективен
std::string encryptPassword(const std::string& password)
{
… // проверка длины
string encrypted; // конструктор по умолчанию
encrypted = password; // присваивание encrypted
encrypt(encrypted);
return encrypted;
}Еще лучше инициализировать encrypted параметром password, избежав таким образом потенциально дорогостоящего конструктора по умолчанию:
// а это оптимальный способ определения и инициализации encrypted
std::string encryptPassword(const std::string& password)
{
… // проверка длины
string encrypted(password); // определение и инициализация
// конструктором копирования
encrypt(encrypted);
return encrypted;
}Это и означает «откладывать насколько возможно» (как сказано в заголовке правила). Вы не только должны откладывать определение переменной до того момента, когда она используется, нужно еще постараться отложить определение до получения аргументов для инициализации. Поступив так, вы избегаете конструирования и разрушения ненужных объектов, а также излишних вызовов конструкторов по умолчанию. Более того, это помогает документировать назначение переменных за счет инициализации их в том контексте, в котором их значение понятно без слов. «А как насчет циклов?» – можете удивиться вы. Если переменная используется только внутри цикла, то что лучше: определить ее вне цикла и выполнять присваивание на каждой итерации или определить ее внутри цикла? Другими словами, какая из следующих конструкций предпочтительнее?