Передача параметра по ссылке против использования переменной Instance - PullRequest
2 голосов
/ 16 сентября 2011

Я начал читать книгу о C ++ и нашел следующий код.Это пример того, как вы можете передавать параметры передачи по ссылке.

#include <iostream>

void swap(int &x, int &y);

int main()
{
    int x = 5, y = 10;

    std::cout << "Main. Before swap, x: " << x
              << " y: " << y << "\n";
    swap(x, y);
    std::cout << "Main. After swap, x: " << x
              << " y: " << y << "\n";
    return 0;
}

void swap(int &rx, int &ry)
{
    int temp;

    std::cout << "Swap. Before swap, rx: " << rx
              << " ry: " << ry << "\n";

    temp = rx;
    rx = ry;
    ry = temp;

    std::cout << "Swap. After swap, rx: " << rx
              << " ry: " << ry << "\n";
}

.

Main. Before swap, x:5 y: 10
Swap. Before swap, rx:5 ry:10
Swap. After swap, rx:10 ry:5
Main. After swap, x:10, y:5

Логика мне понятна.Теперь это может быть очень глупый вопрос (я не очень опытный), но почему вы не можете просто объявить private: int x как переменную экземпляра?Разве x в этом случае не доступен напрямую в вашем классе?(без необходимости указания параметров вообще)?Заранее спасибо за ваши ответы!

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

По нескольким причинам.

  1. Вы должны объявлять переменные в самой узкой области действия .Зачем?Посмотрите на 2 & 3
  2. Переменные стоят дорого, они занимают память, вы хотите их только столько, сколько вам нужно.
  3. Чем больше переменная scope (т. е. какому количеству кода переменная видна), тем больше вероятность того, что вы по ошибке будете использовать переменную, и, следовательно, ее значение может неожиданно измениться.Это будет ошибка, удачи в этом.
  4. Плотная связь (это плохо).Если вы пишете класс и помещаете метод подкачки в класс, и вы пишете его так, чтобы он использовал экземпляр экземпляра x (не переменную метода x), то этот метод подкачки МОЖЕТ ТОЛЬКО ВЕЗДЕ поменять местами с помощью x, если весли вам нужно поменять местами другую переменную (или параметр другого метода в классе), тогда вам нужно переместить значение в x, которое равно Неэффективно & goto 5.Разве не лучше вызывать функцию подкачки со значениями, которые вам нужно передать, без необходимости знать, что есть специальная переменная x, которую вы должны установить в первую очередь?
  5. Возможно появление ошибок.Будет ли этот второй метод вызываться, пока другой метод использует метод подкачки?Каким должно быть значение x после его вызова?Вы представляете много контекста о свопе и знаете, когда можно вызывать своп, и что можно назвать свопом.Это плохо, чем более самодостаточен какой-либо фрагмент кода, тем меньше нужно беспокоиться об этом и о том, как он используется.
  6. Ни один другой класс не может повторно использовать ваш метод подкачки, каждый класс, которыйнуждается в методе подкачки, должен реализовать свой собственный, и это огромный большой нет-нет по большему количеству причин, чем я могу сосчитать здесь, но могу подвести итог, поскольку он испускает DRY Principal

Все эти проблемы можно устранить, просто передавая значения по ссылке.Немного легкомысленно: :)

Надеюсь, это поможет.

1 голос
/ 16 сентября 2011

Передача значений через аргументы в функцию обеспечивает модульность вашего кода.Похоже, вы только начинаете с C ++, поэтому я не уверен, насколько вы знакомы с объектно-ориентированным программированием.Функции / методы представляют собой слой encapsulation .Ваша функция swap () должна инкапсулировать логику, необходимую для выполнения ее функции / цели.Звонящий не должен беспокоиться о том, как это происходит.Если ваша функция swap () должна утверждать, что в программе доступна глобальная переменная, то она не полностью инкапсулирует логику «подкачки».

Кроме того, допустим, вы хотели повторно использовать эту функцию в другом месте вашего класса,Было бы сложно и неуклюже использовать набор глобальных переменных для вызова этой функции.Кроме того, у вас могут быть другие местоположения в вашем классе, которые ссылаются на эти глобальные переменные, и поэтому ваши другие вызовы swap () изменят эти значения, что может вызвать путаницу в других областях кода.

...