Есть ли в скобках после имени типа разница с новым?

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

rfc 3696 http://www.faqs.org/rfcs/rfc3696.html определяет, как это сделать (для http-адресов и электронной почты). Я выполнил свои рекомендации в python, используя lepl (библиотека парсеров). см. http://acooke.org/lepl/rfc3696.html

для использования:

> easy_install lepl
...
> python
...
>>> from lepl.apps.rfc3696 import HttpUrl
>>> validator = HttpUrl()
>>> validator('google')
False
>>> validator('http://google')
False
>>> validator('http://google.com')
True

952
задан Paul Maserrat 19 October 2015 в 15:38
поделиться

5 ответов

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

"Old New Thing" Иногда, память, возвращенная новым оператором, будет инициализирована, и иногда это не будет в зависимости от того, является ли тип, Вы - newing, POD (простые данные) , или если это - класс, который содержит участников POD и использует сгенерированного компилятором конструктора по умолчанию.

  • В C++ 1998 там 2 типа инициализации: нуль и значение по умолчанию
  • В C++ 2003 3-й тип инициализации, инициализация значения была добавлена.

Примите:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

В C++ 98 компиляторов, следующее должно произойти:

  • new A - неопределенное значение
  • new A() - нуль - инициализируют

  • new B - конструкция по умолчанию (B:: m является неинициализированным)

  • new B() - конструкция по умолчанию (B:: m является неинициализированным)

  • new C - конструкция по умолчанию (C:: m инициализируется нулем)

  • new C() - конструкция по умолчанию (C:: m инициализируется нулем)

В C++ 03 совместимых компилятора, вещи должны работать как так:

  • new A - неопределенное значение
  • new A() - значение - инициализирует A, который является нулевой инициализацией, так как это - POD.

  • new B - значение по умолчанию - инициализирует (оставляет B:: m неинициализированный)

  • new B() - значение - инициализирует B, которые обнуляют - инициализирует все поля, так как его значение по умолчанию ctor является компилятором, сгенерированным в противоположность пользовательскому.

  • new C - значение по умолчанию - инициализирует C, который называет значение по умолчанию ctor.

  • new C() - значение - инициализирует C, который называет значение по умолчанию ctor.

Так во всех версиях C++ существует различие между [1 113] и new A(), потому что A является POD.

И существует различие в поведении между C++ 98 и C++ 03 для случая new B().

Это - один из пыльных углов C++, который может свести Вас с ума. При построении объекта иногда Вы хотите/нуждаетесь parens, иногда у Вас абсолютно не может быть их, и иногда он не имеет значения.

919
ответ дан Melebius 20 October 2015 в 01:38
поделиться

new Thing(); явно указывает на то, что вы хотите, чтобы конструктор вызывался, тогда как new Thing; подразумевает, что вы не против, если конструктор не вызывается.

При использовании в структуре / классе с определяемым пользователем конструктором разницы нет. Если вызывается для тривиальной структуры / класса (например, struct Thing { int i; };), то new Thing; похож на malloc(sizeof(Thing));, тогда как new Thing(); похож на calloc(sizeof(Thing)); - он инициализируется нулем.

Гоча лежит между:

struct Thingy {
  ~Thingy(); // No-longer a trivial class
  virtual WaxOn();
  int i;
};

Поведение new Thingy; против new Thingy(); в этом случае изменилось между C ++ 98 и C ++ 2003. См. Объяснение Майкла Берра о том, как и почему.

57
ответ дан hivert 19 October 2015 в 15:38
поделиться

Предположение, что Тест является классом с определенным конструктором, нет никакого различия. Последняя форма делает это немного более ясным, что конструктор Test работает, но это об этом.

10
ответ дан Evan Shaw 20 October 2015 в 01:38
поделиться

В целом у нас есть инициализация по умолчанию в первом случае и инициализация значения во втором случае.

, Например: в случае, если с интервалом (тип POD):

  • int* test = new int - у нас есть любая инициализация и значение *, тест может быть любым.

  • int* test = new int() - *тест будет иметь 0 значений.

следующее поведение зависело от Вашей проверки печатания. У нас есть почтительные случаи: Тест имеет defult конструктора, Тест генерировали конструктора по умолчанию, Тест содержат участника POD, не участника POD...

17
ответ дан hivert 20 October 2015 в 01:38
поделиться

Нет, они - то же. Но существует различие между:

Test t;      // create a Test called t

и

Test t();   // declare a function called t which returns a Test

Это - из-за основного C++ (и C) правило: Если что-то может возможно быть объявлением, то это - объявление.

Редактирование: Ре проблемы инициализации относительно POD и данных не-POD, в то время как я соглашаюсь со всем, что было сказано, я буду точно так же, как, чтобы указать, что эти проблемы только применяются, если вещь, являющаяся new'd или иначе созданный, не имеет пользовательского конструктора. Если будет такой конструктор, то это будет использоваться. Для 99,99% разумно разработанных классов будет такой конструктор, и таким образом, проблемы смогут быть проигнорированы.

16
ответ дан 20 October 2015 в 01:38
поделиться
  • 1
    don' t беспокойство, it' s совершенно нормальная процедура Python, не решительная вообще. – Gordon Gustafson 2 February 2010 в 20:50
Другие вопросы по тегам:

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