#cpp
Всем известно, что ссылки (int & a = b) в с++ имеют полезность при передаче больших объектов в качестве параметра в функцию, пример: SomeType & f(SomeType & obj) { return obj; } Всем понятно, что если & в параметрах не ставить, то создадудтся лишнии копии объектов, следовательно при больших размерах объекта память будет в пустую заниматься этими временными объектами. Необходимо привести пример (связанный или не связанный с примером функции не важно), который показывал бы другую сторону эффективности ссылок в с++, в котором функции не используются вообще. Вопрос задан на собеседовании на который я не ответил. У кого какие идеи? спасибо
Ответы
Ответ 1
Хмм, Можно создать ограниченный массив, используя ссылочный тип в качестве значения, возвращаемого функции. Ограниченный массив - достаточно полезная вещь, т.к. при выполнении с++ кода проверка нарушения границ при индексировании массивов не предусмотрена. Это черевато выходом выходом за границы области памяти, выделенной для массива. Ниже приведу код ограниченного массива. // Простой способ организации безопасного массива. #includeusing namespace std; int &put(int i); // Помещаем значение в массив. int get(int i); // Считываем значение из массива. int vals[10]; int error = -1; int main() { put(0) = 10; // Помещаем значения в массив. put(1) = 20; put(9) = 30; cout << get(0) << ' '; cout << get(1) << ' '; cout << get(9) << ' '; // А теперь специально генерируем ошибку. put(12) = 1; // Индекс за пределами границ массива. return 0; } // Функция занесения значения в массив. int &put(int i) { if(i>=0 && i<10) return vals[i]; // Возвращаем ссылку на i-й элемент. else { cout << "Ошибка нарушения границ!\n"; return error; // Возвращаем ссылку на error. } } // Функция считывания значения из массива. int get(int i) { if(i>=0 && i<10) return vals[i]; // Возвращаем значение i-го элемента. else { cout << "Ошибка нарушения границ!\n"; return error; // Возвращаем значение переменной error. } } Результат, полученный при выполнении этой программы, выглядит так. 10 20 30 Ошибка нарушения границ! Надеюсь смог помочь ._. Ответ 2
#includestruct Animal{ virtual void talk() = 0 ; }; struct Dog:Animal{ void talk(){ printf("Wow-wow! \n"); }; }; int main() { Dog barry; Animal& pet = barry; pet.talk(); //обращаемся к методу наследника по ссылке на предка. return 0; }
Комментариев нет:
Отправить комментарий