зачем использовать не указатель для полей с ++? - PullRequest
1 голос
/ 16 апреля 2011

В эти дни я начинаю махать ногами с c ++, и из-за моего опыта работы с Java у меня, очевидно, возникают некоторые проблемы в понимании некоторых функций c ++.

Поскольку java предлагает только ссылки иПримитивы. Одна из самых загадочных для меня особенностей c ++ - поля без указателей (и не примитивов).

Вот пример того, что я имею в виду.

Если я должен написать реализацию на С ++в c ++ из списка объектов типа XI было бы написать что-то вроде:

class XList{
    private:

        struct node {
            X* data;
            node* next;
        };

        node* first;

    public:
        */
        a lot of methods
        */

}

Этот код, вероятно, ужасен, я знаю о шаблонах, STL и еще много чего, но проблема для менявот только поле «данные».Если объявлять «данные» как указатель X, я предполагаю, что могу использовать его способом, очень похожим на ссылки Java.

Что может быть причиной для объявления данных как X (X data;).В чем разница?Я знаю разницу между распределением в стеке и в куче, но есть ли здесь какое-либо соединение?

Пожалуйста, помогите мне немного лучше разобраться в этой теме.

Спасибо.

--- ОБНОВЛЕНИЕ: ----

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

Вместо этого каждый раз, когда я вижу реализацию некоторой структуры данных, используется простой тип.

Например: если вы ищете"bst c ++ template" в Google вы найдете множество реализаций, подобных этой:

template<class T> 
class BinarySearchTree
{
private:
    struct tree_node
    {
        tree_node* left;
        tree_node* right;
        T data;
    };
    tree_node* root;
public:
    /*
    methods, methods and methods
    */

};

Вы действительно хотите сделать копию всех вставленных данных типа Tна этом дереве, не зная его размера?Поскольку я новичок в языке, я полагаю, что что-то неправильно понял.

Ответы [ 4 ]

1 голос
/ 16 апреля 2011

Преимущество использования X вместо X * заключается в том, что с указателем необходимо выделить место и для X, который использует больше места (4 байта или 8 байтов для указателя). плюс накладные расходы на выделение для X через new), тогда как с простым типом вы избегаете этих накладных расходов. Так что проще просто использовать X.

Вы бы использовали указатель, когда вы не хотите делать копию значения X, но вы можете получить висячие указатели, если не будете осторожны. Вы также можете использовать указатель, если есть обстоятельства, когда у вас может не быть объекта, на который можно указать.

Резюме

  1. Используйте прямой объект для упрощения управления памятью.
  2. Используйте указатель, когда вы не можете позволить себе копирование или вам необходимо представить отсутствие значения.
0 голосов
/ 16 апреля 2011

Основное отличие состоит в том, что если вы объявляете X*, вы отвечаете за управление памятью (new и delete) в куче, тогда как при X память обрабатывается в стеке, поэтомуон выделяется / освобождается с помощью области действия.

Есть и другие тонкие вещи, такие как беспокойство о присвоении себя и т. д.

0 голосов
/ 16 апреля 2011

Я использую элементы данных без указателя, когда: 1) я уверен, что эти данные не должны и не будут передаваться объектам 2) я могу положиться на автоматическое освобождение, когда объект окончательно уничтожен. Хорошим примером является обертка (чего-то, что нужно обернуть):

class Wrapper
{
private:
    Wrapped _wrapped;
public:
    Wrapper(args) : _wrapped(args) { }
}
0 голосов
/ 16 апреля 2011

Разница в том, что указатель указывает на еще не выделенный или определенный кусок памяти.Но когда вы опускаете *, вы говорите «выделенное пространство для всего этого класса (не только указателя на класс) вместе с этим классом».

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

Первый не использует много места (что, от четырех до восьми байтов, в зависимости от архитектуры?) Последний может использовать немного доМНОГО в зависимости от того, что класс X имеет в качестве члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...