Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Пример показывающий эффективность применения ссылок

#cpp


Всем известно, что ссылки (int & a = b) в с++ имеют полезность при передаче больших
объектов в качестве параметра в функцию, пример:
SomeType & f(SomeType & obj)
{ 
  return obj;
}

Всем понятно, что если & в параметрах не ставить, то создадудтся лишнии копии объектов,
следовательно при больших размерах объекта память будет в пустую заниматься этими временными
объектами.
Необходимо привести пример (связанный или не связанный с примером функции не важно),
который показывал бы другую сторону эффективности ссылок в с++, в котором функции не
используются вообще.
Вопрос задан на собеседовании на который я не ответил. У кого какие идеи? 
спасибо     


Ответы

Ответ 1



Хмм, Можно создать ограниченный массив, используя ссылочный тип в качестве значения, возвращаемого функции. Ограниченный массив - достаточно полезная вещь, т.к. при выполнении с++ кода проверка нарушения границ при индексировании массивов не предусмотрена. Это черевато выходом выходом за границы области памяти, выделенной для массива. Ниже приведу код ограниченного массива. // Простой способ организации безопасного массива. #include using 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



#include struct 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; }

Комментариев нет:

Отправить комментарий