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
Давайте станем педантичными, потому что существуют различия, которые могут на самом деле влиять на поведение Вашего кода. Большая часть следующего взята из комментариев, сделанных к статья .
"Old New Thing" Иногда, память, возвращенная новым оператором, будет инициализирована, и иногда это не будет в зависимости от того, является ли тип, Вы - newing, POD (простые данные) , или если это - класс, который содержит участников POD и использует сгенерированного компилятором конструктора по умолчанию.
Примите:
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, иногда у Вас абсолютно не может быть их, и иногда он не имеет значения.
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. См. Объяснение Майкла Берра о том, как и почему.
Предположение, что Тест является классом с определенным конструктором, нет никакого различия. Последняя форма делает это немного более ясным, что конструктор Test работает, но это об этом.
В целом у нас есть инициализация по умолчанию в первом случае и инициализация значения во втором случае.
, Например: в случае, если с интервалом (тип POD):
int* test = new int
- у нас есть любая инициализация и значение *, тест может быть любым.
int* test = new int()
- *тест будет иметь 0 значений.
следующее поведение зависело от Вашей проверки печатания. У нас есть почтительные случаи: Тест имеет defult конструктора, Тест генерировали конструктора по умолчанию, Тест содержат участника POD, не участника POD...
Нет, они - то же. Но существует различие между:
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% разумно разработанных классов будет такой конструктор, и таким образом, проблемы смогут быть проигнорированы.