создайте объект: A.new или новый A?

Я только работал со взаимодействиями CVS мерзавца демонстрационному Мерзавцу для друга, но это было очень просто.

  • необходимо установить текущую копию cvsps . Git cvsimport использование это к истории CVS доступа.
  • Мы нашли, что, для крупного проекта, inital установка был очень быстрее путем делания полной копии CVS repo на компьютер и выполнения git cvsimport локально:

    $ rsync rsync://yourprojecthost.com/cvsroot/yourproject/*  
    $ mkdir myproject.git  
    $ cd myproject.git  
    $ git cvsimport -p -x -v -d :local:/path/to/cvsroot/yourproject 
    

Примечание, что-x после-p очень важен. Это передает-x cvsps. Для получения дополнительной информации посмотрите cvsps страница справочника .

6
задан 3 revs, 2 users 67% 17 October 2009 в 11:09
поделиться

8 ответов

Просто из любопытства: почему C ++ выбирает a = new A вместо a = A.new как способ создания экземпляра объекта? Разве последнее не кажется более объектно-ориентированным?

Не так ли? - структуры данных, состоящие из полей данных и методов вместе с их взаимодействиями - для разработки приложений и компьютерных программ. Методы программирования могут включать такие функции, как сокрытие информации, абстракция данных, инкапсуляция, модульность, полиморфизм и наследование

. Обратите внимание, что это ничего не говорит о синтаксисе. Он не говорит: «и вы должны вызывать каждую функцию, задавая имя объекта, за которым следует точка, за которой следует имя функции».

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

Гуру C ++ осознали это давно и написали статьи например это . Интерфейс объекта - это не , а просто набор методов-членов (которые можно вызывать с помощью синтаксиса точки). Это набор функций, которые могут управлять объектом. На самом деле не имеет значения, являются ли они участниками или друзьями. Он является объектно-ориентированным до тех пор, пока объект может оставаться согласованным, то есть он может предотвратить произвольные функции от того, чтобы вмешиваться в него.

Итак, зачем A.new быть более объектно-ориентированным? Как эта форма предоставит вам «лучшие» объекты?

Одной из ключевых целей ООП было создание более многократно используемого кода.

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

12
ответ дан 8 December 2019 в 03:09
поделиться

. в C ++ используется только для доступа к членам, поэтому правая часть точки всегда является объектом , а не типом . Во всяком случае, было бы логичнее сделать A :: new () , чем A.new () .

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

11
ответ дан 8 December 2019 в 03:09
поделиться

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

Это также привело бы к другой несогласованности:

 int* p = int.new;

C ++ не является чистым языком ООП, в этом не все это объект.

C ++ также позволяет использовать бесплатные функции (что поощряется некоторыми авторами и примером, приведенным в проекте SC ++ L), с которыми программист на C ++ должен быть комфортно.

3
ответ дан 8 December 2019 в 03:09
поделиться

A.new является статической функцией A , тогда как a = new A выделяет память и впоследствии вызывает конструктор объекта

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

, пожалуйста, прочтите код (он работает), и тогда у вас появятся разные идеи:

CObject *p = (CObject*)malloc(sizeof *p);
...
p = new(p) CObject;
p->DoSomthing();
...
2
ответ дан 8 December 2019 в 03:09
поделиться

Фактически, вы можете создать экземпляр объекта с помощью чего-то вроде A.new , если вы добавите правильный метод:

class A{
  public: static A* instance()
  {  return new A(); }
};

A *a = A::instance();

Но это не так. Синтаксис тоже не тот: вы можете различать :: и . «операции», исследуя его правую часть.

Я думаю, что причина в управлении памятью. В C ++, в отличие от многих других объектно-ориентированных языков, управление памятью осуществляется пользователем. Сборщика мусора по умолчанию нет, хотя стандартные и нестандартные библиотеки содержат его вместе с различными методами управления памятью. Поэтому программист должен увидеть оператор new , чтобы понять, что здесь задействовано выделение памяти !

Если только он не был перегружен, использование оператора new сначала выделяет необработанную память , а затем вызывает конструктор объекта, который создает ее в выделенной памяти. Поскольку здесь задействована «сырая» низкоуровневая операция, она должна быть отдельным языковым оператором, а не просто одним из методов класса.

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

Думаю, для этого нет причин. Его a = new a просто потому, что он изначально был составлен таким образом. Оглядываясь назад, вероятно, это должно быть a = a.new ();

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

Почему нужно отделять новый от каждого класса?

Я не думаю, что это вообще необходимо, потому что цель нового - выделить соответствующую память и построить объект, вызвав конструктор. При этом поведение нового уникально и независимо от какого-либо класса. Так почему же dont make is resuable?

Вы можете переопределить new, если хотите управлять памятью самостоятельно (например, выделяя пул памяти один раз и возвращая память по запросу).

0
ответ дан 8 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

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