Я нахожу, что это действительно помогает использовать известные платформы те, которые В спящем режиме, потому что это вмещает Ваш код в определенную форму или образ мыслей. Значение, так как Вы используете, в спящем режиме, Вы пишете коду определенный путь и большинство, если не все разработчики, которые знают, Будут в спящем режиме, то будет в состоянии следовать за Вашим ходом мыслей довольно легко.
существует оборотная сторона к этому, конечно. Прежде чем Вы станете горячим выстрелом, в спящем режиме разработчик, Вы собираетесь найти, что Вы пытаетесь вместить квадрат в круговую дыру. Вы ЗНАЕТЕ то, что Вы хотите сделать, и как Вы, как предполагалось, сделали это, прежде чем Будут в спящем режиме, вошел в изображение, но нахождение Быть в спящем режиме способа сделать его может занять... довольно мало времени.
однако, для компаний, которые часто нанимают консультантов (кто должен понять много исходного кода в короткий срок) или где разработчики входят в систему и часто выходят, или где Вы просто не хотите держать пари, что Ваши ключевые разработчики останутся навсегда и никогда не сменять работу - В спящем режиме, и другие стандартные платформы являются довольно хорошей идеей, я думаю.
Туз /
Указатели C ++ работают точно так же, как объекты Java, в том смысле, что они могут быть недопустимыми ( NULL
) и их дешево передавать в процедуры.
Ссылки C ++ - это тонкая оболочка. вокруг указателей. Они не должны быть недействительными, но в некоторых случаях могут быть. Например, ссылка может быть создана из указателя NULL
или память, на которую он ссылается, может быть удалена.
В приведенном вами примере кода:
Employee boss("Frank");
вы используете нечто, называемое «значением». . В отличие от указателей и ссылок, значения представляют собой объект, который они представляют, а не косвенное обращение.
Мой вопрос в том, когда это уместно использовать указатели VS [значения]? Какая лучшая практика? Как должен Я знаю, как хочу заявить мои переменные большую часть времени?
В C ++ нет сборки мусора, поэтому значения используются, когда область видимости переменной ограничена. Например, вместо того, чтобы выделить одну с помощью new
и освободить с помощью delete
для каждой переменной в процедуре, вы можете разместить их в стеке и не беспокоиться о памяти.
Здесь есть две разные проблемы: создание объектов и обращение к ним.
Есть два места, где создаются объекты: стек и куча. Если вы используете описанный синтаксис:
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
. Если что-то не должно быть нулевым, сделайте это ссылкой.
Обычно вы хотите как можно больше придерживаться ссылок. Причина в RAII . По сути, это гарантирует отсутствие утечек памяти при использовании RAII.
Однако, ИМО, вам следует использовать указатели, когда объекты, которые вы используете, будет очень дорого копировать. Передача типов контейнеров приведет к появлению дубликатов контейнеров ... не лучшая идея.
Лучший способ - использовать интеллектуальные указатели ... в основном ссылки, которые содержат указатель и отслеживают количество ссылок на указатель. Это действительно лучшее из обоих миров ... Дешевая инициализация / копирование и подсчет ссылок практически исключают утечки памяти.
В FAQ по C ++ есть хороший ответ на этот конкретный вопрос:
http://www.parashift.com/c++-faq-lite/references.html#faq-8.6
Два разных зверя: если вы назначаете по указателю, вы получаете отношения n-к-1, которые вы должны обрабатывать с помощью надлежащего управления ресурсами. Обычно это делается в Java.
В том, что вы называете «Справочными объектами», вы получаете разные объекты (которые необходимо отслеживать и т. Д.).
Примечание: я буду использовать «объект» для обозначения объектов и примитивных типов, таких как int, float ... это не то же самое в C ++ (но обычно вы можете игнорировать это).
Используйте значения, когда вы создают объект, которым вы управляете из этой области, и он должен умереть, когда эта область закончится. Кроме того, используйте значение, когда вы хотите использовать копию внешнего объекта, но вы хотите обрабатывать только копию, а не реальный объект. Пример:
int myFunction(int external_value1, Object external_value2){
---
}
Используйте указатели / ссылки при создании объекта, который не должен умереть, когда область его создания заканчивается (убедитесь, что передали указатель на него в какую-то другую область!), Или при использовании внешнего значения, которое дорого обходится копия (например, контейнер), или когда вы хотите работать непосредственно с этим внешним объектом, а не с его копией. Вот почему параметры ввода-вывода функций обычно являются указателями или ссылками, поскольку вы хотите воздействовать на внешний объект (определенный вне области действия функции) напрямую, а не на локальную копию. Пример:
int myOtherFunction(int *external_value1, Object *external_value2{
---
}
В этом примере, если вы оперируете значением, указанным параметрами, вы воздействуете именно на это: значение, на которое указывают эти указатели, тем самым изменяя переменную за пределами области действия функции. Фактически это передача по значению, но вы копируете только указатели и используете их для «атаки» внешних значений.
Ссылки, как указано в другом сообщении, просто синтаксический сахар для указателей. Как только вы поймете указатели, вы поймете ссылки;).
таким образом изменяя переменную вне области видимости функции. Фактически, это передача по значению, но вы копируете только указатели и используете их для «атаки» внешних значений.Ссылки, как указано в другом сообщении, просто синтаксический сахар для указателей. Как только вы поймете указатели, вы поймете ссылки;).
таким образом изменяя переменную вне области видимости функции. Фактически, это передача по значению, но вы копируете только указатели и используете их для «атаки» внешних значений.Ссылки, как указано в другом сообщении, просто синтаксический сахар для указателей. Как только вы поймете указатели, вы поймете ссылки;).