Когда Вы хотите использовать указатели по сравнению со значениями в C++?

Я нахожу, что это действительно помогает использовать известные платформы те, которые В спящем режиме, потому что это вмещает Ваш код в определенную форму или образ мыслей. Значение, так как Вы используете, в спящем режиме, Вы пишете коду определенный путь и большинство, если не все разработчики, которые знают, Будут в спящем режиме, то будет в состоянии следовать за Вашим ходом мыслей довольно легко.

существует оборотная сторона к этому, конечно. Прежде чем Вы станете горячим выстрелом, в спящем режиме разработчик, Вы собираетесь найти, что Вы пытаетесь вместить квадрат в круговую дыру. Вы ЗНАЕТЕ то, что Вы хотите сделать, и как Вы, как предполагалось, сделали это, прежде чем Будут в спящем режиме, вошел в изображение, но нахождение Быть в спящем режиме способа сделать его может занять... довольно мало времени.

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

Туз /

9
задан Mithrax 14 October 2009 в 00:26
поделиться

7 ответов

Указатели C ++ работают точно так же, как объекты Java, в том смысле, что они могут быть недопустимыми ( NULL ) и их дешево передавать в процедуры.

Ссылки C ++ - это тонкая оболочка. вокруг указателей. Они не должны быть недействительными, но в некоторых случаях могут быть. Например, ссылка может быть создана из указателя NULL или память, на которую он ссылается, может быть удалена.

В приведенном вами примере кода:

Employee boss("Frank");

вы используете нечто, называемое «значением». . В отличие от указателей и ссылок, значения представляют собой объект, который они представляют, а не косвенное обращение.

Мой вопрос в том, когда это уместно использовать указатели VS [значения]? Какая лучшая практика? Как должен Я знаю, как хочу заявить мои переменные большую часть времени?

В C ++ нет сборки мусора, поэтому значения используются, когда область видимости переменной ограничена. Например, вместо того, чтобы выделить одну с помощью new и освободить с помощью delete для каждой переменной в процедуре, вы можете разместить их в стеке и не беспокоиться о памяти.

6
ответ дан 4 December 2019 в 13:03
поделиться

Здесь есть две разные проблемы: создание объектов и обращение к ним.

Создание

Есть два места, где создаются объекты: стек и куча. Если вы используете описанный синтаксис:

Employee boss("Frank");

Создает его в стеке. Если вы напишете это:

Employee* boss = new Employee("Frank");

Он создаст его в куче. Если вы не знакомы с концепциями стека и кучи, быть хорошим программистом на C ++ жизненно важно, так что узнайте об этом!

Ссылка

Ссылка на объекты несколько отличается. Независимо от того, как создается объект, на него можно ссылаться с помощью указателя или ссылки (или просто стандартной переменной). Использование ссылок и указателей в C / C ++ на самом деле почти одно и то же, хотя есть важные различия.

При использовании указателей или ссылок, копия объекта создается , а не .

// No copies made:
Employee& frank = boss;  // Using References
Employee* frank = &boss; // Using a Pointer

Копия создается, когда вы не используете ни то, ни другое.

// Copy is made:
Employee frank = boss;

Итак, когда вы будете использовать указатели, а когда ссылки? Я считаю, что хорошей практикой является использование указателей только тогда, когда для них имеет смысл иметь значение null . Если что-то не должно быть нулевым, сделайте это ссылкой.

4
ответ дан 4 December 2019 в 13:03
поделиться

Обычно вы хотите как можно больше придерживаться ссылок. Причина в RAII . По сути, это гарантирует отсутствие утечек памяти при использовании RAII.

Однако, ИМО, вам следует использовать указатели, когда объекты, которые вы используете, будет очень дорого копировать. Передача типов контейнеров приведет к появлению дубликатов контейнеров ... не лучшая идея.

Лучший способ - использовать интеллектуальные указатели ... в основном ссылки, которые содержат указатель и отслеживают количество ссылок на указатель. Это действительно лучшее из обоих миров ... Дешевая инициализация / копирование и подсчет ссылок практически исключают утечки памяти.

2
ответ дан 4 December 2019 в 13:03
поделиться

В FAQ по C ++ есть хороший ответ на этот конкретный вопрос:

http://www.parashift.com/c++-faq-lite/references.html#faq-8.6

1
ответ дан 4 December 2019 в 13:03
поделиться

Два разных зверя: если вы назначаете по указателю, вы получаете отношения n-к-1, которые вы должны обрабатывать с помощью надлежащего управления ресурсами. Обычно это делается в Java.

В том, что вы называете «Справочными объектами», вы получаете разные объекты (которые необходимо отслеживать и т. Д.).

0
ответ дан 4 December 2019 в 13:03
поделиться

Примечание: я буду использовать «объект» для обозначения объектов и примитивных типов, таких как int, float ... это не то же самое в C ++ (но обычно вы можете игнорировать это).

Используйте значения, когда вы создают объект, которым вы управляете из этой области, и он должен умереть, когда эта область закончится. Кроме того, используйте значение, когда вы хотите использовать копию внешнего объекта, но вы хотите обрабатывать только копию, а не реальный объект. Пример:

int myFunction(int external_value1, Object external_value2){
    ---
}

Используйте указатели / ссылки при создании объекта, который не должен умереть, когда область его создания заканчивается (убедитесь, что передали указатель на него в какую-то другую область!), Или при использовании внешнего значения, которое дорого обходится копия (например, контейнер), или когда вы хотите работать непосредственно с этим внешним объектом, а не с его копией. Вот почему параметры ввода-вывода функций обычно являются указателями или ссылками, поскольку вы хотите воздействовать на внешний объект (определенный вне области действия функции) напрямую, а не на локальную копию. Пример:

int myOtherFunction(int *external_value1, Object *external_value2{
    ---
}

В этом примере, если вы оперируете значением, указанным параметрами, вы воздействуете именно на это: значение, на которое указывают эти указатели, тем самым изменяя переменную за пределами области действия функции. Фактически это передача по значению, но вы копируете только указатели и используете их для «атаки» внешних значений.

Ссылки, как указано в другом сообщении, просто синтаксический сахар для указателей. Как только вы поймете указатели, вы поймете ссылки;).

таким образом изменяя переменную вне области видимости функции. Фактически, это передача по значению, но вы копируете только указатели и используете их для «атаки» внешних значений.

Ссылки, как указано в другом сообщении, просто синтаксический сахар для указателей. Как только вы поймете указатели, вы поймете ссылки;).

таким образом изменяя переменную вне области видимости функции. Фактически, это передача по значению, но вы копируете только указатели и используете их для «атаки» внешних значений.

Ссылки, как указано в другом сообщении, просто синтаксический сахар для указателей. Как только вы поймете указатели, вы поймете ссылки;).

2
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: